我有一个类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
}
UPD:如在评论中提到bolov,这个问题不会与C++ 17重现。我用g ++-5和clang-3.8用-std = C++ 11和-std = C++ 14对它进行了测试,它显示了所描述的错误。
无法重现:https://godbolt.org/g/ESR8cw – bolov
@bolov很奇怪,但它并没有重现C++ 17。它在godbolt中用-std = C++ 11重现。我会将其添加到帖子中,谢谢。 –
hmm ..有趣 – bolov