C ++ 14包括标准定义的文字,其中包括std::string
和来自<chrono>
标题的各种时间跨度。
要使用它们,您必须说using namespace std::literals;
(或某些变体,具体取决于您想要的文字,因为它们位于各种内联命名空间中)。
这一切都很好,但我很好奇为什么需要using
声明。没有前导下划线的UDL保留用于实现,因此"hello world"s
不可能在符合标准的程序中具有任何其他含义。
那么为什么#include <string>
不足以将文字转换函数纳入范围?为什么我必须明确包含文字命名空间?
编辑: N3531是我能找到的提案的最新版本 - 遗憾的是,它没有讨论将内容放入命名空间的动机,但只说:
可以总结[波特兰]讨论的要求如下:
- 对(一组相关的)UDL运算符使用内联命名空间
答案 0 :(得分:13)
已经有两个名为s
的UDL:一个用于字符串,一个用于seconds。由于后缀的名称简洁,它们长期遭受名称冲突,因此将它们全部放入一个名称空间不能很好。因此决定将它们放入内联命名空间,这允许明确的(using namespace std::literals::chrono_literals
)和简单的using
指令(using namespace std
)。
答案 1 :(得分:8)
标准库已经定义了s
可能含义的多个版本:
chrono::seconds
文字。一个基于字符串文字,一个基于整数或double
字面值,当然,即它们实际上可以共存。但是,我预计将来s
可能会有更多用途。因此,必须选择导入哪些名称空间而不是强加给你,这似乎是一种合理的方法。
答案 2 :(得分:1)
看看论文N2765。 UDL被挂钩到常规名称查找过程中。由于字符串文字具有常见的字符串类型,因此如果忽略名称空间,则很有可能发生冲突。