多个隐式构造函数转换

时间:2013-09-19 13:17:38

标签: c++ c++11

隐式构造函数转换似乎只适用于单个转换。

class A {
public:
    A(std::string s) {}
};
class B {
public:
    B(A a) { }
};

使用上面的代码,运行

B b{std::string("Hey")};

工作正常。

另一方面,

B b{"Hey"};

没有。

构造函数转换是否真的只适用于单个转换,为什么会这样?为了避免在提供不同的构造函数时可能存在歧义?

2 个答案:

答案 0 :(得分:3)

  

构造函数转换真的只适用于单个转换吗?

单个用户定义的转换,是的。它还可能涉及转换之前或之后的标准转换。

  

为什么会这样?

简单的答案是因为这就是指定语言的方式。

更有用的是:如果允许两次转换,则编译器必须考虑它知道的每种类型,以确定是否存在合适的中间类型。这不仅会有很多工作(如果允许任意数量的转换,会出现组合爆炸),但是您可能会出现歧义,并且行为的细微变化取决于在此时恰好定义的类型。代码。

答案 1 :(得分:2)

B b{"Hey"};需要转换为std::string,然后转换为A,这是两次转换。

  

构造函数转换是否真的只适用于单个转换,为什么会这样?

是。这就是标准所要求的。

[class.conv] / 4:

  

最多一个用户定义的转换(构造函数或转换函数)隐式应用于单个值。