この標準は、ユーザー定義の変換演算子を含む暗黙の変換シーケンスを区別するための2つのルールを提供しているようです。
13.3.3最高の実行可能な関数[over.match.best]
[...]実行可能な関数F1は、[...]の場合、別の実行可能な関数F2よりも優れた関数であると定義されます。
- コンテキストはユーザー定義の変換による初期化であり(8.5、13.3.1.5、および13.3.1.6を参照)、F1の戻りタイプから宛先タイプ(つまり、初期化されるエンティティのタイプ)への標準変換シーケンスは次のとおりです。 F2の戻りタイプから宛先タイプへの標準変換シーケンスよりも優れた変換シーケンス。
13.3.3.2暗黙の変換シーケンスのランク付け[over.ics.rank]
3-次の規則のいずれかが適用されない限り、同じ形式の2つの暗黙的な変換シーケンスは区別できない変換シーケンスです。[...]
- ユーザー定義の変換シーケンスU1は、同じユーザー定義の変換関数またはコンストラクターまたは集約初期化を含み、U1の2番目の標準変換シーケンスが2番目の標準変換シーケンスよりも優れている場合、別のユーザー定義の変換シーケンスU2よりも優れた変換シーケンスです。 U2の。
私が理解しているように、13.3.3を使用すると、コンパイラはさまざまなユーザー定義の変換演算子を区別できますが、13.3.3.2を使用すると、コンパイラは、引数にユーザー定義の変換が必要なさまざまな関数(一部の関数のオーバーロード)を区別できます。 f
((GCC 4.3の)次のコードが与えられた場合のサイドバーを参照してください。参照への変換が2回呼び出されるのはなぜですか?)
ユーザー定義の変換シーケンスを区別できる他のルールはありますか?https://stackoverflow.com/a/1384044/567292での回答は、13.3.3.2:3が、(変換演算子に対する)暗黙のオブジェクトパラメーターのcv-qualificationに基づいて、ユーザー定義の変換シーケンスを区別できることを示しています。コンストラクターまたは集計の初期化に対する単一のデフォルト以外のパラメーターですが、それぞれのユーザー定義の変換シーケンスの最初の標準変換シーケンス間の比較が必要になることを考えると、それがどのように関連するかわかりません。言及しているようです。
S1がS2よりも優れていると仮定すると(S1はU1の最初の標準変換シーケンスであり、S2はU2の最初の標準変換シーケンスです)、U1はU2よりも優れているということになりますか?言い換えれば、このコードは整形式ですか?
struct A {
operator int();
operator char() const;
} a;
void foo(double);
int main() {
foo(a);
}
g ++(4.5.1)、Clang(3.0)、Comeau(4.3.10.1)はそれを受け入れ、非const-qualifiedを優先A::operator int()
しますが、あいまいで形式が正しくないために拒否されると思います。これは標準の欠陥ですか、それとも私の理解の欠陥ですか?