これに関して SO に関する他の質問を見たことがありますが、完全に説明しているものはありません。以下の 2 つの状況をコンパイラが処理する正しい方法は何ですか? gcc 4.7.1 (with -std=c++0x)、VS2010、および VS2012 で試してみましたが、すべてで異なる結果が得られました。
例 1:
struct BB
{
// generic cast
template<typename T>
operator T() const
{
return 0;
}
// string cast
operator std::string() const
{
return string("hello");
}
};
int main()
{
BB b;
string s = b;
}
出力:
- gcc 4.7.1: わかりました
- VS2010: わかりました
- VS2012: 失敗: 「BB から文字列に変換できません」
例 2:
struct BB
{
// generic cast
template<typename T>
operator T() const
{
return 0;
}
// string cast
operator std::string() const
{
return string("hello");
}
};
int main()
{
BB b;
string s = (string)b;
出力:
- gcc 4.7.1: 失敗: オーバーロードされた文字列 (BB&) の呼び出しがあいまいです
- VS2010: わかりました
- VS2012: 失敗: 「BB から文字列に変換できません」