【发布时间】:2018-03-16 17:28:05
【问题描述】:
考虑以下代码sn-p:
class A;
class B {
public:
B(){}
B(A&) // conversion constructor that takes cv-unqualified A
{
cout << "called B's conversion constructor" << endl;
}
};
class A {
public:
operator B() const // conversion operator that takes cv-qualified A
{
cout << "called A's conversion operator" << endl;
return B();
}
};
int main()
{
B b = A(); // who gets called here?
return 0;
}
根据this question,具有最少cv限定形式的转换序列获胜(规范中的13.3.3.2/3):
标准转换序列 S1 是更好的转换序列 标准转换序列 S2 如果 [...] S1 和 S2 是参考 绑定(8.5.3),引用所指的类型是 相同的类型,除了顶级 cv 限定符和类型 由 S2 初始化的引用比 cv 更合格 S1 初始化的引用所引用的类型。
然而,在上面的 sn-p 中,转换运算符总是被选中,无论 A 在两个函数中是否是 cv 限定的。唯一的例外是,当构造函数和运算符都是 cv 限定时,编译器会抱怨在选择转换顺序时存在歧义,而 cv 不限定的情况则不会(为什么?)。
所以问题是:
- 为什么在这种情况下总是选择转换运算符?
- 为什么两个 cv-qualified 都会导致歧义,而 cv-unqualified 不会?
【问题讨论】:
-
最多只能调用一次用户定义的隐式转换。
标签: c++ type-conversion qualifiers