这个问题是关于c++标准的措辞的。

所有编译器,我认为应该是这样,取消复制构造函数以初始化对象b bellow(assembly here):

struct B;

struct A{
    operator B();
};

struct B{
    B(const B&);
    B(B&&);
};

void test(A a){
    B b(a);
}

但是当我阅读该标准时,我不明白为什么会发生这种省略(大胆的说法)[dcl.init]/17.6.2:



具体来说就是调用了构造函数。但是没有编译器会这样做。

我想我缺少了一些东西或没有正确阅读标准。我应该如何阅读标准?

这与标准的前几段和下几段形成了鲜明对比,后者专门规定了复制省略[dcl.init]/17.6.1:



和[dlc.init] /17.6.3:



最后一句话使我回到[dcl.init] /17.6.1,这也意味着复制省略。

最佳答案

@ T.C。在评论中回答,这是核心语言问题CWG2327

关于c++ - 当参数转换为目标类型时,复制构造函数省略项以进行直接初始化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54297545/

10-13 04:58