根据"Inside C++对象模型“,编译器只在以下四种条件中的任何一种为真时才生成副本构造函数(如果不是程序员声明的话):
类包含存在副本构造函数的类的成员对象时(类设计器显式声明(如前一个字符串类,或由编译器合成,如类Word),当类派生自存在副本构造函数的基类时(再次声明或synthesized)
的继承链时)。
这意味着如果我有一个只有构造函数的类,那么编译器就不会提供复制构造函数。
让我们举一个例子:
class test
{
test(){}
};
int main()
{
test obj1; //statement 1
test obj2(obj1); //statement 2
}
以上代码工作正常。现在,当我在类测试中添加以下行时,问题就出现了:
test(const test& rhs) = delete;
"=删除“确保不自动提供复制构造函数。在添加了上面的行后,我得到了语句2的一个错误,即Use of deleted function test::test(const test&)
。
我的问题是:按照"Inside C++对象模型“,我不需要上述类的复制构造函数,所以当我明确地说不生成副本构造函数(使用删除)时,为什么会出现错误?因为我期望编译器不需要上述类的复制构造函数。
我正在使用gcc版本4.6.3。
发布于 2012-06-01 09:47:46
要使类可以复制,它需要有一个复制构造函数。无论您是自己编写,还是编译器为您生成一个,这都无关紧要-- test a; test b(a);
必须可用才能成为有效的操作。
您显式地强制编译器删除复制构造函数--这是旧的“让复制构造函数私有”的新版本。它不允许复制。所以不要为你不能复制而感到惊讶。因为你告诉编译器不要允许它。
发布于 2012-06-01 09:48:08
隐式生成的复制构造函数的标准单词是class.copy/7
如果类定义没有显式声明副本构造函数,则将隐式声明一个副本构造函数。如果类定义声明了一个移动构造函数或移动赋值操作符,则隐式声明的复制构造函数被定义为已删除;否则,它被定义为defaulted (8.4)。如果类具有用户声明的复制赋值操作符或用户声明的析构函数,则不建议使用后一种情况。
和类。拷贝/13
默认且未定义为已删除的复制/移动构造函数,如果它被odr使用(3.2),或者在其第一次声明后显式默认时,它将被隐式定义。注意:即使实现省略了odr-使用(3.2,12.2),复制/移动构造函数也是隐式定义的。-end注意,如果隐式定义的构造函数满足constexpr构造函数(7.1.5)的要求,则隐式定义的构造函数是constexpr。
因此,仍然会为test
生成一个复制构造函数,并由语句2调用它。我相信,“C++对象模型内部”指的是复制构造函数并不简单。
发布于 2012-06-01 09:47:36
这一行:
test obj2(obj1)
正在尝试调用复制构造函数。
https://stackoverflow.com/questions/10854948
复制