4

未声明的(自动生成的)复制构造函数是否自动标记为inline

如果是这样,并且如果我不希望它们被标记为inline,这是否意味着我必须手动定义一个并手动复制我需要的每个成员(假设我没有使用 C++11,所以没有= default从中获利)?

4

4 回答 4

8

它们被视为已声明inline(这并不一定意味着它们将被内联)。是的,在 C++11 之前,防止它们被内联的唯一方法是手动声明和定义它们,在初始化列表中显式复制每个成员和每个基类。

于 2013-01-11T20:32:28.130 回答
6

是的。从 C++11、12.8/11 开始:

隐式声明的复制/移动构造函数是inline public其类的成员。

如果您想更熟悉复制和移动构造函数,我强烈建议您阅读 12.8 的全部内容。

于 2013-01-11T20:31:17.043 回答
1

他们是,我相信。但是,对于这样一个编译器定义的函数,和 not 之间的区别inline是不可观察的。是的,你必须定义你自己的,它是非的inline,尽管你为什么想要这样的东西超出了我的范围。它对语义没有影响,也不会影响编译器的内联。

于 2013-01-11T20:30:44.070 回答
1

隐式定义的特殊成员函数是inline并且它们必须是,因为它们可以在多个翻译单元中隐式生成。的意思inline是它可以在多个翻译单元中定义而不违反ODR,而不是代码实际上会被内联(这取决于类型和编译器)。

为什么不希望复制构造函数成为inline

于 2013-01-11T20:32:09.300 回答