是`使用命名空间std :: literals的安全
Is `using namespace std::literals` safe?
通常,全局范围中的 using namespace
被视为不良实践。但是,根据cppReference,在用户定义的文字的情况下,标识符不从下划线开始(_
(保留。
用于用户定义的文字的标识符用作 ud-suffix ,它将称为此功能。必须从下划线_:不以下划线开头的后缀保留给标准库提供的文字运算符。
。
这是否意味着我可以在全局范围内安全地进行using namespace std::literals;
?
这些用户定义的文字非常新。您必须在这里了解标准体;他们没有实际用途的经验(与Say Boost不同(。因此,他们提出了一种保守的方法:一侧,预定义的后缀在namespace std
中,在另一侧,用户定义的文字必须以_
开头。
这确实在中间留下了一个开放空间:不是从_
开始但在全局名称空间中定义的后缀。随着我们在现有文字方面获得经验,可以做出决定定义此类文字的决定。
因此,为了使未来的代码进行防止,无论将来的标准在这里做出了什么选择,您都不应该给其他人带来太多问题。但这是否意味着"在全局名称空间中避免using
"?否。每个翻译单元都可以做出自己的选择。在您自己的.cpp文件中,做自己喜欢的事情。但是您不应该影响其他翻译单元。因此,实际规则是:
using namespace std::literals
是标题中不安全。
从标准的角度来看,当他们说某些名称由标准库保留时,我将不保证定义的行为,如果您打破了约定。另一方面,某些编译器可能不会要求您违反规定的约定。例如,gcc
给出了警告,而不是错误,因为没有使用下划线启动字面操作员标识符。
这里更好的表述不是包括
using namespace std::literals;
在全球范围中是安全实践,但是它是否是防御性编程策略。将using namespace foo
放在全球范围中不是防御性编程,因为这样做至少在某种程度上打败了名称空间的目的。
现在,考虑到您的特定代码库,您可能永远不会遇到这样做的问题。但这只是您的判断。如果您打算与他人共享代码,我建议防御性地编程,以便您的代码不知情的用户不会有机会遇到意外情况(即使他们不遵循所有公约,或者如果将来修改了标准(。
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 通过网络、跨平台传递std::变体是否安全
- 在std::thread中,joinable()然后join()线程安全吗
- 使用std::istream::peek()总是安全的吗
- 从值小于256的uint16到uint8的Endian安全转换
- 在c++队列中使用pop和visit实现线程安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 安全到标准:移动会员?
- AcquireCredentialsHandleA() 返回 PFX 文件的0x8009030e(安全包中没有可用的凭据
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 是`使用命名空间std :: literals的安全