我有一個類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