C++11 构造函数重载解析与编译
有了一个包含3个构造函数的结构TB,下面的代码将被编译,复制构造函数——“构造函数a”将被调用两次。注释掉“构造函数C”会导致编译问题 原因是什么 为什么取消构造函数B中常量的注释会影响编译结果 这是否与重写默认的复制分配运算符有关 此处适用的处置规则是什么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 =
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);