用户定义文字的作用域是什么

What is the scope of a user-defined literal?

本文关键字:作用域 是什么 文字 定义 用户      更新时间:2023-10-16

考虑以下两个:

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

用户定义的文字被视为对operator "" X (...)的调用,其中 X 是一个标识符(例如,_x), ...取决于用户定义的文字的形式。然后,根据非限定查找的通常规则继续查找适当的用户定义文字操作符; [lex.ext] :

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

_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是不同类型的用户定义的文字操作符,也可以,例如,如果一个是整数文字操作符,另一个是浮点文字操作符。