2

ルールのオーバーロードについて少し混乱していますが、

次のリテラル演算子があるとしましょう。

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 の両方が標準の説明から何らかの形で有効です。

誰かが私の疑問を解消するのを手伝ってくれることを願っています. どうもありがとう。

4

1 に答える 1

4

13.5.8 / 7でこの問題が明らかになると思います:

注:リテラル演算子とリテラル演算子テンプレートは通常、ユーザー定義のリテラル(2.14.8)を介して暗黙的に呼び出されます。ただし、上記の制約を除いて、これらは通常の名前空間スコープ関数と関数テンプレートです。特に、それらは通常の関数や関数テンプレートのように検索され、同じ過負荷解決ルールに従います。

私の理解では、通常の過負荷解決ルールは、ユーザー定義のリテラルを介した暗黙的な呼び出しの外部で呼び出された場合にのみ、リテラル演算子に対して暗示されます。

13_xxしたがって、2と3が定義されている場合は、 2(生のリテラル演算子)を呼び出すと思います。

于 2010-12-08T09:07:58.997 に答える