为什么默认情况下全局命名空间中没有C++ 14标准定义的文字?

Tri*_*dle 20 c++ user-defined-literals c++14

C++ 14包括标准定义的文字,其中包括标题中的std::string各种时间跨度<chrono>.

要使用它们,您必须说using namespace std::literals;(或者某些变化取决于您想要的文本,因为它们位于各种内联命名空间中).

这一切都很好,但我很好奇为什么using需要声明.没有前导下划线的UDL保留用于实现,因此"hello world"s在符合标准的程序中不可能有任何其他含义.

那么为什么#include <string>不足以将文字转换功能纳入范围呢?为什么我必须明确包含文字命名空间?

编辑: N3531是我能找到的提案的最新版本 - 不幸的是,它没有讨论将东西放入命名空间的动机,但只说:

可以总结[波特兰]讨论的要求如下:

  • 为一组(相关的)UDL运算符使用内联命名空间

Col*_*mbo 13

已经有两个名为UDL的UDL s:一个用于字符串,一个用于.由于后缀的名称简洁,它们长期遭受名称冲突,因此将它们全部放入一个名称空间不能很好.因此,决定将它们放入内联命名空间,这允许明确的(using namespace std::literals::chrono_literals)和简单的using指令(using namespace std).

  • @TristanBrindle ...想象一下,为了这个论点,标准委员会本身想要引入第二个"运算符""s`. (3认同)
  • 为了使你的例子更加真实,想象一下`better_string`是一个[`string_view`](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3762.html). (2认同)

Die*_*ühl 8

标准库已经定义了多个版本的s含义:

  1. 它可用于定义字符串文字.
  2. 它可以用来定义chrono::seconds文字.

一个基于字符串文字,一个基于整数或double文字,当然,即它们实际上可以共存.但是,我希望将来有更多的用途s.因此,必须选择导入哪些命名空间而不是强加给你似乎是一种合理的方法.