为什么在下面的代码中调用第一个复制构造函数?

时间:2012-01-24 12:10:15

标签: c++ copy-constructor

为什么在对象B(B&)的构造中调用B(const B&) ctor而不是b1

#include <iostream>
using namespace std;

struct B
{
    int i;
    B() : i(2) { }
    B(B& x) : i(x.i) { cout << "Copy constructor B(B&), i = " << i << endl; }
    B(const B& x) : i(x.i) { cout << "Copy constructor B(const B&), i = " << i << endl; }
};

int main()
{
    B b;
    B b1(b);
}

5 个答案:

答案 0 :(得分:6)

这是因为重载决策适用,并且因为b1的构造函数的参数是b,并且b恰好是非const左值,所以构造函数采用非const lvlalue被选中。这是第一个。有趣的是,两者都是复制构造函数,但是你的代码只对后者有效。

答案 1 :(得分:5)

因为b不是常量。因此,它完全匹配第一个副本ctor,这就是编译器使用的。

答案 2 :(得分:2)

13.3.3.2/3说

  

相同形式的两个隐式转换序列是不可区分的转换序列,除非一个   以下规则适用:

     

- 标准转换序列S1是比标准转换序列更好的转换序列   S2 if:

     

S1和S2是引用绑定(8.5.3),引用引用的类型相同   除了顶级cv限定符之外的类型,以及S2引用的引用引用的类型   比由S1初始化的引用所引用的类型更多的cv限定。 [实施例:

int f(const int &);
int f(int &);
...
int i;
int j = f(i); // calls f(int&)

在你的情况下,因为参数是非const的,所以选择了复制c-tor的非const版本,因为它是更好的匹配。

答案 3 :(得分:1)

因为b不是常数。

答案 4 :(得分:1)

试试这个:

int main() {
    const B b;
    B b1(b);
}

此外,您是否应该使用 const 是一个很难的决定;)