我知道如果copy ctor在类中声明为private,编译器将不会生成默认的copy ctor。
但是有人能解释一下为什么编译器会这样做吗?
如果copy ctor声明为protected,会发生什么情况?编译器会提供默认的复制ctor吗?
如果copy ctor声明为private,但有一个定义,如foo(const& obj){}
发布于 2010-10-03 23:15:39
类中声明的任何复制构造函数(无论是私有的、公共的还是受保护的)意味着编译器不会生成默认的复制ctor。然后类中声明的代码是否也被定义,或者不仅控制具有适当可见性的代码是否可以复制类的实例(如果没有定义,链接器将会抱怨;编译器的工作只是抱怨没有适当可见性的使用,而不是复制链接器的工作)。
例如,如果您声明了一个私有的复制ctor,那么如果它试图复制一个实例,则只允许编译类中的函数中的代码(当然是朋友)。如果没有定义ctor,那么该代码将无法在链接器中幸存下来,因此您无论如何都会得到一个错误(只是不幸的是,在构建过程中稍晚一点,即与较早检测到的错误相比,在构建时可能会适度浪费计算资源)。
发布于 2010-10-03 23:11:19
编译器知道存在复制构造函数,所以它不会生成一个。此阶段不考虑可访问性(公共/私有/受保护)或是否有定义。
听起来好像没有拷贝构造函数,只是因为你不能从外部和非好友调用私有函数。用户定义的构造函数仍然存在,只是它是私有的。
如果它是受保护的,那么只有子类和它自己可以调用复制构造函数。也不会有隐式定义的复制构造函数。
发布于 2010-10-03 23:18:04
$12/1 -“默认构造函数(12.1)、复制构造函数和复制赋值运算符(12.8)以及析构函数(12.4)是特殊的成员函数。[注意:当程序没有显式声明某些类类型时,实现将为某些类类型隐式声明这些成员函数。如果使用它们,实现将隐式定义它们。...”
因此,在复制构造函数被显式声明的情况下,编译器将其视为具有定制复制构造函数的意图,并且隐式复制构造函数的生成被抑制。
复制构造函数可以声明并定义为私有。如果复制构造函数被定义为私有,则复制初始化/直接初始化将不会工作,如下所示。
struct A{
A(){}
private:
A(A const &){}
};
int main(){
A a1;
A a2(a1); // direct initialization, error
A a3 = a1; // copy initialization, error
}https://stackoverflow.com/questions/3850284
复制相似问题