C++ 用户定义的文本的范围是什么?

C++ 用户定义的文本的范围是什么?,c++,c++11,user-defined-literals,C++,C++11,User Defined Literals,考虑以下两个方面: 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文本定义了两次,但其中一个在名称空间X1中定义,另一个在名称空间X2中定义 根据C++标准,该代码可以编译吗?< /P> < P>用户定义的文字被视为对“代码>操

考虑以下两个方面:

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
文本定义了两次,但其中一个在
名称空间X1
中定义,另一个在
名称空间X2
中定义


根据C++标准,该代码可以编译吗?< /P> < P>用户定义的文字被视为对“代码>操作符”的调用“<代码/ >代码> x>代码>代码>(…)>代码>其中代码“> X <代码>是标识符(例如,<代码> x x/COD>),而<代码>…>代码>取决于用户定义的文字。然后,根据非限定查找的常规规则查找相应的用户定义的文本运算符[lex.ext]

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

如果使用
使用名称空间
声明或输入其中一个名称空间,使两个定义都可用于非限定查找,则
\u x
的定义仅会发生冲突;只有在实际调用了不合格的操作员时,冲突才有问题

{ 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 x/COD>是不同类型的用户定义的文字运算符,也可以,例如,如果一个是整数文字运算符,另一个是浮点文字运算符。< / P>不,我不能在VisualC++中执行它,它不支持这个。我建议使用,或者相当于在线编译器。它不编译,但不是因为你想的原因。让操作符接受
unsigned long long
参数,而不是
int
。我只想补充一点,使用
的相应
用法将是
使用X1::operator“”\u x
以防有人发现此问题并感到疑惑。