8

次の 2 つを検討してください。

namespace X1
{
    A operator "" _x(unsigned long long i) { return A{i}; }
};

namespace X2
{
    B operator "" _x(unsigned long long i) { return B{i}; }
};

xリテラルは 2 回定義されていますが、そのうちの 1 つは で定義され、namespace X1もう 1 つは で定義されていnamespace X2ます。

C++ 標準によると、このコードはコンパイルできますか?

4

1 に答える 1

12

ユーザー定義リテラルは、 whereは識別子 (たとえば、)の呼び出しとして扱われ、ユーザー定義リテラルの形式によって異なります。次に、適切なユーザー定義リテラル演算子の検索が、非修飾検索の通常の規則に従って続行されます。[lex.ext] :operator ""X(...)X_x...

2 -ユーザー定義リテラルは、リテラル演算子またはリテラル演算子テンプレート (13.5.8) の呼び出しとして扱われます。ud-suffixを持つ特定の user-defined-literalLのこの呼び出しの形式を決定するために、リテラル サフィックス識別子が であるliteral-operator-id が、修飾名検索の規則を使用するコンテキストで検索されます (3.4.1)。 . [...]XXL

リテラルの定義が競合するのは、 or宣言またはいずれかの名前空間に入ること_xによって、両方の定義が非修飾ルックアップに使用できるようになっている場合のみです。競合は、修飾されていない演算子への呼び出しが実際に行われた場合にのみ問題になります。usingusing namespace

{ using namespace X1; auto o = 5_x; }          // OK; o is of type A
{ using namespace X2; auto o = 5_x; }          // OK; o is of type B
{ using namespace X1; using namespace X2; }    // OK; operator "" _x is not used
{ using namespace X1; using namespace X2; auto o = 5_x; }  // ambiguous

_xたとえば、一方が整数リテラル演算子で、もう一方が浮動小数点リテラル演算子である場合など、異なるタイプのユーザー定義リテラル演算子であっても問題ありません。

于 2014-08-22T17:33:52.583 に答える