繁体   English   中英

为什么调用`A a(c);`在main()中不明确?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM