14

以下のコードでは、あいまいさのために複数のキャスト演算子が定義されていると、コンパイラ エラーが発生することが予想されます。

#include <iostream>
#include <sstream>

struct A
{
    operator const char*() { return "hello world\n"; }
    operator float()       { return 123.0F; }
    //operator int()         { return 49; }
};

int main()
{
    A a;
    std::stringstream ss;
    ss << a;
    std::cout << ss.str();
    return 0;
}

代わりに、数値キャスト演算子が 1 つだけ定義されている限り、エラーや警告なしでコンパイルされ、数値キャストが優先して使用されますoperator const char *()。宣言された演算子の順序に違いはありません。

ただし、operator int()operator float()の両方が定義されている場合は、最初から期待どおりの結果が得られます。

「演算子 <<」はあいまいです

キャストの優先順位規則はありますか?または、コンパイラがデフォルトで数値キャストを選択するのはなぜですか? どのキャストを意味するかを明示的に述べる必要があることは理解していますが、私の質問は、コンパイラが行うデフォルトの選択に関するものです。


編集:コンパイラMSVC 2010の使用

4

1 に答える 1

4

変換は、C++ 標準の § 13.3.3.1 に従ってランク付けされます。特に、例に関連するユーザー定義の変換シーケンスは、§ 13.3.3.1.2/1 によって規制されています。

「ユーザー定義の変換シーケンスは、最初の標準変換シーケンスとそれに続くユーザー定義の変換 (12.3)、それに続く 2 番目の標準変換シーケンスで構成されます。 [...] ユーザー定義の変換が変換関数 ( 12.3.2)、最初の標準変換シーケンスは、ソース型を変換関数の暗黙的なオブジェクト パラメーターに変換します。"

ここでのすべての変換シーケンスには以下が含まれます。

  1. 変換関数の暗黙的なオブジェクト パラメーターのソース型への架空の変換。
  2. ユーザー定義の変換。
  3. の入力型への恒等変換operator <<

これらの変換シーケンスはすべて同じランクです。したがって、呼び出しはあいまいでなければなりません。そうでない場合、私にとってはコンパイラのバグです。

于 2013-01-16T14:25:32.860 に答える