gpt4 book ai didi

c++ - 前向声明、unique_ptr 和类内初始化器

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:13 26 4
gpt4 key购买 nike

我已阅读 Is std::unique_ptr<T> required to know the full definition of T?Forward declaration with unique_ptr? ,但我的问题更具体。

以下编译:

// Compile with $ g++ -std=c++11 -c <filename>
#include <memory>
class A; // fwd declaration

class AUser
{
AUser(); // defined elsewhere
~AUser(); // defined elsewhere
std::unique_ptr<A> m_a;
};

以下不是:

// Compile with $ g++ -std=c++11 -c <filename>
#include <memory>
class A; // fwd declaration

class AUser
{
AUser(); // defined elsewhere
~AUser(); // defined elsewhere
std::unique_ptr<A> m_a{nullptr};
};

错误

$ g++ -std=c++11 -c fwd_decl_u_ptr.cpp 
In file included from /usr/include/c++/4.7/memory:86:0,
from fwd_decl_u_ptr.cpp:3:
/usr/include/c++/4.7/bits/unique_ptr.h: In instantiation of ‘void std::default_delete<_Tp>::operator()(_Tp*) const [with _Tp = A]’:
/usr/include/c++/4.7/bits/unique_ptr.h:173:4: required from ‘std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = A; _Dp = std::default_delete<A>]’
fwd_decl_u_ptr.cpp:9:33: required from here
/usr/include/c++/4.7/bits/unique_ptr.h:63:14: error: invalid application of ‘sizeof’ to incomplete type ‘A’

编辑:据我了解,这里发生的是类内初始化程序意味着能够初始化 unique_ptr<A>已经在申报AUser的时刻.自类型 unique_ptr<A>实际上是 unique_ptr<A, default_delete<A>> , 能够初始化它意味着能够初始化 default_delete<A> .而且,为此,A必须完全定义。

这个推理中的薄弱环节是假设类内初始化器暗示了在类声明时初始化相应数据成员的能力!这似乎是一个直观的不证自明,因为初始化程序是声明的一部分。但如果我在标准中找到明确说明的内容,我会更自在。否则我仍然可以想到不需要它的实现解决方案。例如,编译器可以简单地采用初始化表达式并将其仅应用于未明确给出属性初始化的构造函数。

那么,任何人都可以向我推荐一个标准部分/摘录,它暗示在第二种情况下必须对 A 进行完整定义吗?我没有在标准中找到太多关于类内初始化器的信息(只发现它们被称为非静态的“brace-or-equal-initializers数据成员”),但与此无关。

最佳答案

第二种情况生成默认析构函数[incorrect] 代替AUser定义 [/incorrect](在这种情况下,它实际上是在处理整个代码之后完成的).与 AUser 中的构造函数定义相同。

无论如何,您仍然需要在同一编译单元中提供 A 的定义。那么,也许只是这样的事情就能让您满意?

#include <memory>

class A;

class AUser
{
std::unique_ptr<A> m_a;
AUser();
};


class A
{
// ...
};


AUser::AUser()
: m_a(nullptr)
{ }

关于c++ - 前向声明、unique_ptr 和类内初始化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18914805/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com