8

考虑这两个:

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++标准,这段代码可以编译吗?

4

1 回答 1

12

用户定义的文字被视为对where is an identifier(例如)的调用,并且取决于用户定义的文字的形式。然后根据非限定查找的通常规则继续查找适当的用户定义文字运算符;[lex.ext]operator ""X(...)X_x...

2 -用户定义的文字被视为对文字运算符或文字运算符模板 (13.5.8) 的调用。为了使用ud-suffix确定给定user-defined-literal的调用形式,在L使用非限定名称查找规则的上下文中查找其文字后缀标识符的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 回答