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で密接 多くを見て、 最後から弾丸が、この タイブレークがいる場合にのみ適用されることを明らかにタイブレークされた第2の変換 シーケンスこと は事実ですが2つの シーケンスには、同じ ユーザー定義の変換シーケンスが含まれており、この例では該当しない が含まれています。 1つのコンストラクタの変換 配列がB ::オペレータA()と 他の用途のB ::演算子のchar *()を使用しているため は、 は、二つ ユーザ定義の変換シーケンスと それらが曖昧である間にタイブレークありません。
私の質問はこれです。
13.3.3.2 P3は 以下のルールのいずれかが適用されない限り 同じ形の
二つの暗黙的な変換配列は区別できない 変換配列である、と述べています。
私の理解から言えば、キーワードは「次のルールの1つ」です。 "同じ変換シーケンス"と書かれている箇条書き は上記のものすべてを上書きしているわけではありません。私は "S1のランクはS2のランクよりも良い "と考えていたでしょうか?
C++はそれほど複雑ではないと確信しています... – Hexagon
C++コミュニティメンバーの連絡先があるので、問題を提出するように頼んではいけませんか? (または、http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.htmlに提出されているかどうか確認してください) –
問題があるとは言いませんでした。標準。 –