根据“内部C++对象模型”,只有在以下四个条件中至少有一个条件为真时,才会生成复制构造函数(如果程序员未声明):什么时候在C++中生成默认构造函数
当类包含一个复制构造函数存在的类的成员对象时(或者由类设计器显式声明,就像前一个String类的情况一样,或者由编译器合成) Word类)
当这个类是从一个复制构造函数存在的基类派生的(同样,明确地声明或合成的)
当类声明一个或多个虚拟功能
当类是从其中一个或多个基类是虚拟继承链衍生
这意味着如果我只有构造函数的类,那么复制构造函数将不会被编译器提供。
让我们举个例子:
class test
{
test(){}
};
int main()
{
test obj1; //statement 1
test obj2(obj1); //statement 2
}
上面的代码工作正常。现在问题来了,当我在类测试中添加以下行:
test(const test& rhs) = delete;
“= delete”确保复制构造函数不会自动提供。添加上面的行后,我得到一个错误报告说2 Use of deleted function test::test(const test&)
。我的问题是:按照“内部C++对象模型”我不需要上述类的复制构造函数,所以当我明确说不生成复制构造函数(使用删除)为什么我得到一个错误?因为我期待编译器不需要上述类的复制构造函数。
我使用的是gcc版本4.6.3。
如果没有提供_copy-constructor_,那么您的语句2将不会编译。 –
它工作正常,如果我不添加测试(常量测试和rhs)在课堂上。 – user1431221
语句2不使用默认构造函数,它使用复制构造函数,并且如果声明了它并将其删除(您所做的),那么它将不会编译,因为语句2会匹配已删除的签名。 – birryree