如何在命名空间中引用用户定义的文字运算符?

How to refer to user defined literal operator inside a namespace?

考虑以下因素:

#include <iostream>

namespace X
{
    void operator ""_test(unsigned long long x)
    {
        std::cout << x;
    }
}

int main()
{
    using namespace X;
    10_test;
    // 10_X::test; /* doesn't work */
}

我可以通过显式 using namespace X; 引用 namespace X 中的 user defined literal operator。有什么方法可以在不显式包含名称空间的情况下引用文字运算符吗?我尝试了

10_X::test;

但当然不起作用,因为解析器认为 X 指的是运算符的名称。

X::operator ""_test(10)

能用,但很笨拙。

#include <iostream>

namespace X {
  inline namespace literals {
    void operator ""_test(unsigned long long x) {
      std::cout << x;
    }
  }
}

int main() {
  {
    using namespace X::literals;
    10_test;
  }
  {
    using X::operator""_test;
    10_test;
  }
}

_test既在X又在X::literals。这允许人们 using namespace X::literals; 而无需从 X 中提取所有内容,但在 X_test 也是可用的。

导入单个文字有点烦人。

stdstd::chronostd::literals 以及 std::chrono::literals 都执行此操作。 inline namespaces 允许您定义命名空间的子部分,您认为人们希望将这些子部分作为一个块导入而不获取其余部分。