为什么在对象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);
}
答案 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 是一个很难的决定;)