ルールのオーバーロードについて少し混乱していますが、
次のリテラル演算子があるとしましょう。
unsigned long long operator "" _xx(unsigned long long cooked_literal_int); //1
unsigned long long operator "" _xx(const char * raw_literal_string); // 2
unsigned long long operator "" _xx(long double cooked_literal_double); // 3
1、2、および 3 の両方が定義されている場合、オーバーロードは明らかです。
13_xx //call 1
13.5_xx //call 3
1 と 2 が定義されている場合、
13_xx //call 1
13.5_xx //call 2
2 と 3 が定義されている場合
13_xx // call 2 or 3??
13.5_xx // call 3
混乱は、最新の c++0x 標準 n3225 2.14.8/3 に由来します。
L がユーザー定義の整数リテラルの場合、n を ud 接尾辞なしのリテラルとします。S に unsigned long long 型のパラメーターを持つリテラル演算子が含まれている場合、リテラル L は次の形式の呼び出しとして扱われます。
演算子 "" X (n ULL)
それ以外の場合、S には生のリテラル演算子またはリテラル演算子テンプレート (13.5.8) が含まれますが、両方は含まれません。S に生のリテラル演算子が含まれている場合、リテラル L は次の形式の呼び出しとして扱われます。
演算子 "" X ("n")
それ以外の場合 (S にリテラル演算子テンプレートが含まれる)、L は次の形式の呼び出しとして扱われます。
operator "" X <'c1', 'c2', ... 'ck'>()
ここで、n はソース文字シーケンス c1c2...ck です。
これは、1 が存在する場合 (unsigned long long パラメータ)、13_xx が 1 を呼び出し、それ以外の場合、13_xx が 2 を呼び出すことを示しています。
特に、それらは通常の関数や関数テンプレートのように検索され、同じオーバーロード解決規則に従います。
私の理解では、1 が存在しない場合、13_xx を暗黙的に double に変換して 3 を呼び出すことができます。
したがって、1 が存在しない場合、2 と 3 の両方が標準の説明から何らかの形で有効です。
誰かが私の疑問を解消するのを手伝ってくれることを願っています. どうもありがとう。