【问题标题】:Does copy-constructor or constructor work when we do copy initialization当我们进行复制初始化时,复制构造函数或构造函数是否工作
【发布时间】:2014-09-30 12:42:52
【问题描述】:
#include <iostream>

using namespace std;

class ExClass
{
    int data;
    ExClass(const ExClass&);

public:
    ExClass() : data(0) {}
    ExClass(int d) : data(d) { cout<<"Constructor"<<endl; }
};

int main()
{
    ExClass var(2);
    ExClass var2=2;

    return 0;
}

为了测试当我使用复制初始化时它是调用复制构造函数还是构造函数,我将复制构造函数设为私有。虽然它适用于 Visual c++ 2005,但代码块 13.12(使用 C++11 标准编译)会出错。

当我按原样运行它时,它会给出:

Constructor 

Constructor

作为输入。

我说对了吗认为这意味着 var(2)var2=2 具有相同的含义并且它们都调用了相同的构造函数?

如果是,为什么代码块会出错?由于它不使用复制构造函数,因此它不应该给出错误。

【问题讨论】:

    标签: c++ constructor


    【解决方案1】:

    这个……

    ExClass var2=2;
    

    ...等价于这个...

    ExClass var2 = ExClass(2);
    

    ...名义上调用复制构造函数,但标准有一个特殊规定,允许将其省略为var2 的直接构造。这是编译器可以选择执行的 可选 优化 - 只有 如果 编译器没有忽略复制构造函数的缺失定义才有意义。但无论哪种方式,编译器都必须检查复制构造是否是合法操作(例如,它没有被删除)。

    因此,两个编译器都是正确的,实际上,同一个编译器可能会出错,也可能不会出错,具体取决于调用它的命令行优化标志。

    【讨论】:

      【解决方案2】:

      ExClass var2 = 2;

      2 转换为ExClass 临时(prvalue),然后使用该prvalue 初始化var2。第二步涉及移动或复制构造函数(通常)。可以省略对该复制/移动构造函数的调用,但它必须是可能的/有效的。 (如果省略了调用,则复制/移动 ctor 不用于 odr,因此不需要定义。)

      Standardese 可以在 [dcl.init]/17 和 [class.copy]/31ff 中找到

      【讨论】:

        猜你喜欢
        • 2021-02-08
        • 2022-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多