我有一个类C,其中有一个转换运算符可以转换为任何类型。在这个例子中,我尝试以三种不同的方式将其实例转换为std :: string:
static_cast , std :: string 的构造函数和赋值给 std :: string 。然而,只有最后一种编译,而其他方法会引发模糊的构造函数错误。
错误的原因很清楚:有很多方法可以将C转换为std :: string的构造函数可以接受的内容。但是这些情况之间有什么区别?为什么转换运算符在这里起作用但在其他地方却不起作用?
struct C {
template<typename T>
operator T() const {
return T{};
}
};
int main() {
C c;
cout << static_cast<string>(c) << endl; // compile error
string bad(c); // compile error
string ok = c; // compiles successfully
}
更新:正如bolov在评论中提到的那样,使用C++17不会出现这个问题。我测试了使用-std=c++11和-std=c++14的g++-5和clang-3.8,结果显示出了描述的错误。
operator const char*
,歧义就会再次出现。现在没有模板了。 - Ivan Smirnovstring ok = c;
不是赋值,而是复制初始化;其初始值设定项包含等号。 - songyuanyao