【发布时间】:2014-12-22 18:50:49
【问题描述】:
C++14 包括标准定义的文字,其中包括 std::string 和来自 <chrono> 标头的各种时间跨度。
要使用它们,您必须说 using namespace std::literals;(或一些变化,具体取决于您想要的文字,因为它们位于各种内联命名空间中)。
这一切都很好,但我很好奇为什么需要using 声明。没有前导下划线的 UDL 被保留用于实现,因此"hello world"s 在符合标准的程序中不可能有任何其他含义。
那么为什么#include <string> 不足以将文字转换功能带入作用域呢?为什么必须显式包含字面量命名空间?
编辑:N3531 是我能找到的最新版本的提案——不幸的是,它没有讨论将事物放入命名空间的动机,而只是说:
可以将[波特兰]讨论的要求总结如下:
- 为(一组相关的)UDL 运算符使用内联命名空间
【问题讨论】:
-
可能出于同样的原因,用户定义的文字必须以
_开头:forward compatibility。他们预计将来某个时候会添加更多文字,我想他们会将它们放在不同的命名空间中以避免命名冲突。 -
@Close voter:我非常怀疑这是基于意见的。标准委员会做出了决定。这是在问为什么他们做出了他们所做的决定。这不是基于意见。它基于委员会内部的历史讨论和决定,这是事实。
-
“没有前导下划线的 UDL 被保留用于实现”在哪里,在什么版本中?
-
啊,
[usrlit.suffix]部分,至少从 n3485 草案开始就一直存在。所以不应该在需求之前编写任何代码。
标签: c++ c++14 user-defined-literals