未声明(自动生成)的复制构造函数是否自动标记为inline
?
如果是这样,如果我不希望它们被标记为inline
,那是否意味着我必须手动定义一个并手动复制我需要的每个成员(假设我不使用C ++ 11,这样就没有= default
可以利用了吗?
答案 0 :(得分:8)
他们被视为被宣布为inline
(事实并非如此)
必然意味着他们将被内联)。是的,在
pre-C ++ 11,防止它们内联的唯一方法就是
手动声明和定义它们,复制每个成员和每个成员
初始化列表中显式的基类。
答案 1 :(得分:6)
是。从C ++ 11,12.8 / 11:
隐式声明的复制/移动构造函数是其类的
inline public
成员。
如果你想更熟悉复制和移动构造函数,我强烈建议阅读全部12.8。
答案 2 :(得分:1)
我相信他们是。但是,对于这样的编译器定义的函数,inline
与否之间的差异是不可观察的。是的,你必须定义自己的非inline
,尽管为什么你会想要这样的事情超出我的范围。它对语义没有影响,也不会影响编译器的内联。
答案 3 :(得分:1)
隐式定义的特殊成员函数是inline
,它们必须是在多个翻译单元中隐式生成的。 inline
的含义是它可以在不违反ODR的情况下在多个翻译单元中定义,而不是实际内联代码(这取决于类型和编译器)。
为什么不希望复制构造函数为inline
?