C++11 构造函数重载解析与编译

C++11 构造函数重载解析与编译,c++11,constructor,C++11,Constructor,有了一个包含3个构造函数的结构TB,下面的代码将被编译,复制构造函数——“构造函数a”将被调用两次。注释掉“构造函数C”会导致编译问题 原因是什么 为什么取消构造函数B中常量的注释会影响编译结果 这是否与重写默认的复制分配运算符有关 此处适用的处置规则是什么 int doIgetHere = 0; struct TA{ int a; }; struct TB{ int b; //Constructor A TB(TA &ta){ b =

有了一个包含3个构造函数的结构TB,下面的代码将被编译,复制构造函数——“构造函数a”将被调用两次。注释掉“构造函数C”会导致编译问题

原因是什么

为什么取消构造函数B中常量的注释会影响编译结果

这是否与重写默认的复制分配运算符有关

此处适用的处置规则是什么

int doIgetHere = 0;

struct TA{
    int a;
};

struct TB{
    int b;
    //Constructor A
    TB(TA &ta){
        b = ta.a;
    }

    //Constructor B 
    TB(/*const*/ TB &tb){
        doIgetHere++;
        b = tb.b;
    }

    // Constructor C === removing this constructor cause compilation problem, why ?
    TB(TB && mtb){
        doIgetHere++;
        b = mtb.b;
    }
};

int main(){
    TA ta;     

    TB tb1(ta);  // using constructor A
    TB tb2 = ta; // using constructor A     

    std::cout<<doIgetHere<<"\n"; // result is 0, as expected
}
18:2:注意:候选构造函数不可行:第一个参数需要一个l值

    TB(/*const*/ TB &tb){  

    ^ 1 error generated.  
当你这样做的时候

TB tb2 = ta;
实际上等于

TB tb2 = TB(ta);
换句话说,从
ta
创建一个临时对象,然后在复制构造函数(您的构造函数B)中使用它

这里的问题是非常量引用不能绑定到临时对象。解决方法是简单地将参数设置为常量引用(您出于某种原因将其注释掉)


使用非标准移动构造函数(构造函数C),您可以将临时对象作为参数,这是右值引用工作的一部分。

当询问“编译问题”时,请包括“问题”。请编辑您的问题以包括错误、复制粘贴(作为文本)、完整、完整,包括任何可能的信息注释,且不进行修改。关于您的构造函数,(您的“构造函数B”)的参数应为
常量
参考。和(您的“构造函数C”)的参数应该是非常量值引用。请包含错误或其他重要的相关信息。别忘了复制粘贴完整的输出。我希望只使用“构造函数A”,添加任意构造函数不会导致编译问题,除非它与重写默认构造函数有关,我错了吗?@Someprogrammerdude我修复了移动构造函数,thanksI不明白为什么只使用构造函数A,尽管构造函数B和构造函数C都可用。当有三个构造函数时,变量doIgetHere保持为零。@Nir您可能应该阅读一篇关于编译器优化的文章,名为。即使复制构造函数可能不会被调用,它仍然必须存在(正确声明)。在这种情况下,我建议您默认它,例如
TB(TB const&)=default
TB tb2 = TB(ta);