考虑这两个:
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
字面值定义了两次,但其中一个定义在namespace X1
中,而另一个定义在namespace X2
中。
根据C ++标准,可以编译这段代码吗?
答案 0 :(得分:12)
用户定义的文字被视为对operator ""
X
(...)
的调用,其中 X
是标识符(例如,_x
)和...
取决于用户定义的文字的形式。然后根据通常的非限定查找规则进行相应的用户定义文字运算符的查找;的 [lex.ext] 强>:
2 - user-defined-literal 被视为对文字运算符或文字运算符模板的调用(13.5.8)。要使用 ud-suffix
L
确定给定用户定义文字X
的此调用形式, literal-在X
的上下文中使用以下规则查找其文字后缀标识符为L
的operator-id 不合格的名称查找(3.4.1)。 [...]
如果_x
或using
声明或输入任一名称空间的两个定义都可用于非限定查找,则using 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
是不同类型的用户定义的文字运算符,也可以。如果一个是整数文字运算符而另一个是浮点文字运算符。