【发布时间】:2012-06-01 17:41:24
【问题描述】:
根据“内部 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 将无法编译。
-
如果我不在课堂上添加 test(const test& rhs) 效果很好。
-
语句 2 不使用默认构造函数,它使用复制构造函数,如果您声明它并删除它(您已经这样做了),那么它不会编译,因为语句 2 匹配删除的签名.
-
您应该查看书中的引文,因为您复制的版本不正确。如果书上真的这么说,那就大错特错了。
-
如果您使用的是已删除的构造函数,那么您使用的是 C++11,我很确定那本书的任何版本都没有涵盖 C++11。关于复制构造函数何时被隐式定义的规则发生了变化。也就是说,您引用的规则看起来像 C++03 中 non-trivial 复制 ctor 的规则。隐式声明的复制 ctor 在使用时被隐式定义,即复制对象时,如语句 2 中所示。
标签: c++