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使用X2::运算符“”编码>和代码>以防有人发现此问题并感到疑惑。