c++ - 隐式声明和隐式定义的复制构造函数有什么区别?

标签 c++ copy-constructor

我在这里查看复制构造函数的 cppreference 页面: http://en.cppreference.com/w/cpp/language/copy_constructor

关于隐式声明的复制构造函数和隐式定义的复制构造函数我已经阅读了 2 节,但我仍然不明白它们的区别。隐式声明但未定义的构造函数不会导致链接器问题吗?

规则非常复杂。我不记得 C++03 有什么区别:要么你有一个编译器生成的复制构造函数,要么你没有。

有人可以解释(用更简单的话)这两个类别之间的区别/差异吗?

最佳答案

这在标准第 12 条开头的注释中得到了澄清:

[ Note: The implementation will implicitly declare these member functions for some class types when the program does not explicitly declare them. The implementation will implicitly define them if they are odr-used (3.2). See 12.1, 12.4 and 12.8. — end note ]

C++14 (N3936) 的标准引用是 12.1/5、12.4/6、12.8/13、12.8/26。在每种情况下,如果相应的特殊成员函数是默认的且未定义为已删除,并且是 odr-used 或显式默认,则它会被隐式定义。如果我们有类似的东西

struct Foo {};

并且没有创建 Foo 类型的对象,所有六个特殊成员函数(默认构造函数、析构函数、复制构造函数、移动构造函数、复制赋值运算符、移动赋值运算符)都被隐式声明为默认值,但未定义,因为它们不是 odr-used。

关于c++ - 隐式声明和隐式定义的复制构造函数有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26149463/

相关文章:

c++ - 在链表中移动和复制构造函数

c++ - 链表复制构造函数实现细节

c++ - 错误 : C2664: 'QXmlStreamWriter::writeAttributes' : cannot convert parameter 1 from 'QVector<T>' to 'const QXmlStreamAttributes &'

c++ - 临时函数调用 : UB?

c++ - vector 问题的 vector

c++ - C++ 中的继承 : Order of Construction

c++ - 当 `a = b()` 和 `a` 都属于 `b` 类时, `X` 是什么意思?

c++ - 从数据中创建/放置圆圈/网格的简单数据可视化

c++ - 在 windows 和 solaris 之间以二进制格式交换数据有哪些可能的方法?

c++ - 语义略有不同的复制构造函数和赋值运算符中是否存在陷阱?