【发布时间】:2016-08-27 21:44:00
【问题描述】:
为什么在main() 中调用A a(c); 不明确?
struct C;
struct A {
A() { std::cout << "default ctor A" << '\n'; }
A(const A&) { std::cout << "copy A" << '\n'; }
A(C&) { std::cout << "ctor A(C)" << '\n'; };
};
struct C {
C() { std::cout << "default ctor C" << '\n'; }
operator A() { std::cout << "C::operator A()" << '\n'; return A(); };
};
int main()
{
C c;
A a(c);
}
代码打印(clang 和 GCC):
default ctor C
ctor A(C)
如果我们注释掉构造函数 A::A(C&),代码会打印:
default ctor C
C::operator A()
default ctor A
copy A
copy A
【问题讨论】:
-
为什么应该它是“模棱两可的”?所谓的歧义在哪里?
-
根据操作的优先级。
-
@WakeupBrazil 其中一个直接调用构造函数,另一个首先调用转换运算符,然后调用构造函数。一种操作优于两种操作也就不足为奇了。
-
按照你的逻辑,将
char传递给void func(int); void func(char);也应该是模棱两可的。 -
一个是“精确匹配”,另一个是“转换”。前者是一个更好的重载。
标签: c++ initialization language-lawyer ambiguous c++17