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

时间:2014-10-27 14:45:15

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

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

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

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

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

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

  

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

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

3 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:8)

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

  1. 它可用于定义字符串文字。
  2. 可用于定义chrono::seconds文字。
  3. 一个基于字符串文字,一个基于整数或double字面值,当然,即它们实际上可以共存。但是,我预计将来s可能会有更多用途。因此,必须选择导入哪些名称空间而不是强加给你,这似乎是一种合理的方法。

答案 2 :(得分:1)

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