`using namespace std::literals` 安全吗?

Is `using namespace std::literals` safe?

一般情况下,全局范围内的using namespaceconsidered as a bad practice. However, according to cppreference,不以下划线开头的标识符(_)在用户自定义字面量的情况下为标准库保留。

the identifier to use as the ud-suffix for the user-defined literals that will call this function. Must begin with the underscore _: the suffixes that do not begin with the underscore are reserved for the literal operators provided by the standard library.

这是否意味着我可以在全球范围内安全地 using namespace std::literals;

从标准的角度来看,当他们说某些名称由标准库保留时,如果您违反约定,我会将其解释为不保证已定义的行为。另一方面,一些编译器可能不会让您对违反规定的约定负责。例如,gcc 给出警告,而不是错误,因为文字运算符标识符不以下划线开头。

这里更好的表述不是是否包括

using namespace std::literals;

在全局范围内是一种安全的做法,但它是否是一种好的防御性编程策略。将 using namespace foo 置于全局范围内并不是防御性编程,因为这样做至少部分违背了命名空间的目的。

现在,鉴于您的特定代码库,您可能永远不会 运行 遇到这样做的问题。但这仅供您判断。如果您打算与其他人共享您的代码,我建议您进行防御性编程,这样您的代码的不知情用户就没有机会 运行 进入意外情况(即使他们不t 遵循所有约定,或者如果将来修改标准)。

这些 user-defined 文字很新。您必须了解此处的标准 body;他们没有实际使用经验(不像 Boost)。所以他们想出了一个保守的方法:一方面,预定义的后缀在 namespace std 中,另一方面 user-defined 文字必须以 _.

开头

这确实在中间留下了一个开放的space:不以_开头但在全局名称space中定义的后缀。当我们获得对现有文字的经验时,可能会决定由谁来定义这些文字。

因此,对于 future-proof 您的代码,无论在未来的标准中做出何种选择,您都不应该给其他人造成太多问题。但这是否意味着 "avoid the using in the global namespace"?不可以。每个翻译单元都可以做出自己的选择。在您自己的 .cpp 文件中,做您喜欢的事。但是你不应该影响其他翻译单元。因此实际规则是:

using namespace std::literals 在 headers 中不安全。