[英]Why isn't the call `A a(c);` in main() ambiguous?
为什么不是呼叫A a(c);
在main()
模棱两可?
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
如果你有这个,那么重载决策过程的目标是确定如何将C
转换为A
,那么它确实是不明确的,因为可以使用转换构造函数或转换函数:
void f(A);
f(c);
但是,这与以下情况不同:
A a(c);
这里,重载决策用于确定要调用的A
构造函数,因此它选择其参数类型与参数类型完全匹配的构造函数。
标准参考是C ++ 14中的[over.match.ctor] / 1:
当类类型的对象被直接初始化(8.5),或者从相同或派生类类型(8.5)的表达式进行复制初始化时,重载决策选择构造函数。 对于直接初始化,候选函数是正在初始化的对象的类的所有构造函数。 对于复制初始化,候选函数是该类的所有转换构造函数(12.3.1)。 参数列表是初始化程序的表达式列表或赋值表达式 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.