隐式构造函数转换似乎只适用于单个转换。
class A {
public:
A(std::string s) {}
};
class B {
public:
B(A a) { }
};
使用上面的代码,运行
B b{std::string("Hey")};
工作正常。
另一方面,
B b{"Hey"};
没有。
构造函数转换是否真的只适用于单个转换,为什么会这样?为了避免在提供不同的构造函数时可能存在歧义?
答案 0 :(得分:3)
构造函数转换真的只适用于单个转换吗?
单个用户定义的转换,是的。它还可能涉及转换之前或之后的标准转换。
为什么会这样?
简单的答案是因为这就是指定语言的方式。
更有用的是:如果允许两次转换,则编译器必须考虑它知道的每种类型,以确定是否存在合适的中间类型。这不仅会有很多工作(如果允许任意数量的转换,会出现组合爆炸),但是您可能会出现歧义,并且行为的细微变化取决于在此时恰好定义的类型。代码。
答案 1 :(得分:2)
B b{"Hey"};
需要转换为std::string
,然后转换为A
,这是两次转换。
构造函数转换是否真的只适用于单个转换,为什么会这样?
是。这就是标准所要求的。
[class.conv] / 4:
最多一个用户定义的转换(构造函数或转换函数)隐式应用于单个值。