20

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

要使用它们,您必须说using namespace std::literals;(或一些变化,具体取决于您想要的文字,因为它们位于各种内联名称空间中)。

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

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

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

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

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

3 回答 3

13

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

于 2014-10-27T14:58:51.047 回答
8

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

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

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

于 2014-10-27T15:00:08.443 回答
1

查看纸张 N2765。UDL 与常规名称查找过程挂钩。由于字符串文字具有常见的字符串类型,因此如果您忽略命名空间,则很有可能发生冲突。

于 2014-10-27T14:57:55.463 回答