struct A
{
A(const A& src);
A(const char* src);
};
struct B
{
operator A();
operator char*();
};
void test()
{
B v;
A s(v);
}
EDG/Comeau和MSVC允許代碼,而GCC 4.4.4,CLANG和BCC 將它拒絕爲不明確。這應該不明確嗎? (隱式強制轉換)
A C++委員會成員回答說與此(最初):
它不是不明確; A(const A &) 構造函數優於A(const char *)構造函數。 const的甲& 參數直接結合的結果轉換函數的 ,所以 轉換序列被認爲是 是一個用戶定義的轉換由一個標識轉換 (13.3.3.1.4p1),接着 。 const char * 參數是用戶定義的轉換 ,後面是限定條件 轉換,所以更糟糕。
然後,他跟着這個。
其實我錯了。雖然 事實,在一個用戶定義的轉換 序列中的第二轉換 序列是決勝局,在13.3.3.2p3尋找更多 緊密結合,在未來 到最後一顆子彈,表明這 決勝局只適用於當兩個 序列包含相同的 用戶定義的轉換序列,而 在本例中不是這種情況。 由於一個構造的轉換 序列使用B ::操作員A()和 其他用途B ::操作者的char *(), 有兩個 用戶定義的轉換序列和 它們是模棱兩可之間沒有決勝局。
我的問題是這樣的。
13.3.3.2 P3指出,的 相同的形式
兩個隱式轉換的序列是無法區分的 轉換序列除非的 以下規則中的一個應用。
從我的理解,這些關鍵字是「以下規則之一」。 這並不意味着聲明「相同轉換序列」 的項目符號覆蓋了上述所有項目。我會認爲「S1的排名比S2的排名更好 」可以用來代替嗎?
很好的證明,C++得到它有點太複雜了...... – Hexagon 2010-11-24 05:45:12
既然你有一個C++社區成員聯繫,你不應該只是要求他提出問題嗎? (或檢查是否在http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html提交) – 2010-11-24 06:13:09
我沒有說有問題,我實際上試圖瞭解標準。 – 2010-11-24 06:25:12