用户定义的文字的范围是什么?

M. *_* E. 8 c++ user-defined-literals c++11

考虑这两个:

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

namespace X2
{
    B operator "" _x(unsigned long long i) { return B{i}; }
};
Run Code Online (Sandbox Code Playgroud)

x文本被定义了两次,但其中一人在规定namespace X1而另一个定义namespace X2.

根据C++标准,可以编译这段代码吗?

eca*_*mur 12

用户定义的文字被视为对where 是标识符的调用(例如,),并且取决于用户定义的文字的形式.然后根据通常的非限定查找规则进行相应的用户定义文字运算符的查找; [lex.ext]:operator ""X(...)X_x...

2 - 用户定义的文字被视为对文字运算符或文字运算符模板的调用(13.5.8).要确定具有ud-suffix的给定用户定义文字L的此调用的形式,在使用非限定名称查找规则的上下文中查找其文字后缀标识符为的literal-operator-id (3.4.1).[...]XXL

的的定义_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
Run Code Online (Sandbox Code Playgroud)

如果_x是不同类型的用户定义的文字运算符,例如,如果一个是整数文字运算符而另一个是浮点文字运算符,那也没关系.