隐式转换限制

Implicit casting limitations

我正在尝试支持类型系统中文字值的隐式转换。这些隐式转换是有意且理想的(见注释 1)。我知道 C++ 可以在表达式中执行多个隐式转换。下面main第二行不行

class A {
public:
    A(const std::string&);
};

class B {
public:
    B(const A&);
};

int main(void)
{
    A("example");  // this works
    B("example");  // this does not work
}

如果我向 A 添加一个 const char* 构造函数,则第二行有效...

class A {
public:
    A(const char*);
    A(const std::string&);
};

class B {
public:
    B(const A&);
};

int main(void)
{
    A("example");  // this works
    B("example");  // now it works
}

为什么第一个实现不起作用?第二行可以将const char*构造成std::string,然后构造成A,最后构造成B.

注1:可隐式转换的类型的值是相同的值,类型只表示该值通过了一个前置条件,通过操作保持它的条件,并通过对类似的操作传播该条件类型。允许将类型隐式转换为具有较弱前提条件的其他类型。

与标准转换不同,implicit conversion sequence最多可以包含一个用户定义的转换。

Implicit conversion sequence consists of the following, in this order:

1) zero or one standard conversion sequence;

2) zero or one user-defined conversion;

3) zero or one standard conversion sequence.

对于您的第一个代码片段,给定 B("example");,需要两个用户定义的转换; const char*std::stringstd::stringA

作为解决方法,您可以在尝试时添加另一个转换构造函数,或添加显式转换以构造 B,例如

B(A("example"));

要实现隐式转换,您必须将数据类型放在括号中,然后是变量(int)(var)