隐式转换限制
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::string
和 std::string
到 A
。
作为解决方法,您可以在尝试时添加另一个转换构造函数,或添加显式转换以构造 B
,例如
B(A("example"));
要实现隐式转换,您必须将数据类型放在括号中,然后是变量(int)(var)
我正在尝试支持类型系统中文字值的隐式转换。这些隐式转换是有意且理想的(见注释 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::string
和 std::string
到 A
。
作为解决方法,您可以在尝试时添加另一个转换构造函数,或添加显式转换以构造 B
,例如
B(A("example"));
要实现隐式转换,您必须将数据类型放在括号中,然后是变量(int)(var)