采取这个代码:
struct Foo {
operator char() {
return '1';
}
operator std::string() {
return "0";
}
};
int main() {
std::string name;
Foo foo;
name = Foo(); //error: '=' is ambiguous
}
我认为赋值不明确,因为std::string
有一个赋值运算符采用char
. 是否可以进行Foo
赋值以std::string
选择std::string's
复制构造函数std::string
?当这些歧义发生时,你是否也可以对其他类型做同样的事情?
不,您需要明确指定类型:
但是,
std::string
有一个assign
成员函数,其效果与 相同=
,但没有有问题的重载:一般来说,您需要明确您想要的类型,如我上面所示。在某些情况下,可能还有其他更简单的解决方法。
此外,所有这些问题的出现只是因为转换函数不是
explicit
。char
考虑对和进行隐式转换是否真的合理std::string
。多个(尤其是隐式)转换函数也很容易导致其他重载解析问题。一般来说,明确转换是更安全的方法。