何时在C++中生成默认构造函数

1 c++

根据"Inside C++ Object Model",只有当以下四个条件中的任何一个为真时,编译器才会生成复制构造函数(如果程序员没有声明):

  1. 当类包含存在复制构造函数的类的成员对象时(由类设计器显式声明,如前一个String类的情况,或由编译器合成,如类Word的情况)

  2. 当类派生自存在复制构造函数的基类时(同样,显式声明或合成)

  3. 当类声明一个或多个虚函数时

  4. 当类派生自一个或多个基类是虚拟的继承链时

这意味着如果我有一个只有构造函数的类,那么编译器将不会提供复制构造函数.

让我们举一个例子:

class test
{
    test(){}
};
int main()
{
    test obj1;       //statement 1
    test obj2(obj1); //statement 2
}
Run Code Online (Sandbox Code Playgroud)

以上代码工作正常.现在问题来自我在类测试中添加以下行:

test(const test& rhs) = delete;
Run Code Online (Sandbox Code Playgroud)

"= delete"确保不会自动提供复制构造函数.添加上面的行后,我收到了声明2的错误Use of deleted function test::test(const test&).

我的问题是:根据"内部C++对象模型",我不需要上述类的复制构造函数,所以当我明确说不生成复制构造函数(使用删除)时,为什么会出现错误?因为我期望编译器不需要上面类的复制构造函数.

我使用的是gcc 4.6.3版.

Cat*_*lus 8

对于可复制的类,它需要有一个复制构造函数.无论您是自己编写,还是编译器为您生成一个,都无关紧要 - 它必须可用于test a; test b(a);有效操作.

您明确强制编译器删除复制构造函数 - 这是旧版"make copy constructor private"的新版本.它不允许复制.所以不要惊讶你不能复制.因为你告诉编译器不允许它.