【发布时间】:2016-04-02 02:37:48
【问题描述】:
考虑一下简单的代码:
struct A;
struct B {
B(){}
B(A const&){ }
};
struct A {
operator int() const {return 0;};
};
void func(B){}
void func(char){}
int main()
{
func(A()); //ambiguous call oO
}
首先,我不确定我是否正确理解了所有内容,因此请在您发现我的错误时纠正我。
我的理解是应该选择void func(B),因为func 的参数是A,这是类类型,因此所需的转换类型是“用户定义的转换序列”
现在来自 IBM C++ 参考:
用户定义的转换序列包括以下内容:
- 标准转换序列
- 用户定义的转换
- 第二个标准转换序列
现在存在两个用户定义的转换
B::B(const A&) 和 A::operator int (const A&);
所以顺序是
-> A() -> B::B(const A&) -> Standard conversion (identity conversion)
-> A() -> A::operator int (const A&) -> Standard conversion (integral conversion)
由于积分转换比身份转换差,我认为void func(B) 会调用,但调用仍然模棱两可。
所以请帮助我在哪一点上我错了,为什么这个电话是模棱两可的。非常感谢:)
【问题讨论】:
-
我认为将
B喂给func(B)是身份,A->B::B->func(B)可能不是;不过应该检查标准。