【问题标题】:What is the scope of a user-defined literal?用户定义文字的范围是什么?
【发布时间】:2014-08-22 17:08:59
【问题描述】:

考虑这两个:

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

【问题讨论】:

  • 不,我在 Visual C++ 中做不到,它还不支持。
  • 我推荐使用 ideone.com , coliru.stacked-crooked.com 或者类似的在线编译器。
  • 它不能编译,但不是你想的那样。使操作员接受unsigned long long 参数而不是int

标签: c++ c++11 user-defined-literals


【解决方案1】:

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

2 - user-defined-literal 被视为对文字运算符或文字运算符模板 (13.5.8) 的调用。为了确定给定 user-defined-literal Lud-suffix X 的调用的形式,literal-operator-id 其文字后缀标识符为 XL 的上下文中查找 使用非限定名称查找规则 (3.4.1) 。 [...]

只有当usingusing namespace 声明或输入任一命名空间使这两个定义都可用于非限定查找时,_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 是不同类型的用户定义的文字运算符,例如如果一个是整数文字运算符,另一个是浮点文字运算符。

【讨论】:

  • 我想补充一点,相应的using 用法将是using X1::operator"" _x;using X2::operator"" _x;,以防有人发现这个问题并想知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多