为了对std::string
使用operator""s
,您必须using namespace std::string_literals
。但是不以 _
开头的用户定义字面量是保留的,所以可能的冲突不能成为借口。其他 operator""s
来自 std::chrono
但那是针对 int 文字的,所以那里也没有冲突。
这是什么原因?
最佳答案
将字面量放入命名空间的原因其实有两个:
- 用户使用
using namespace std;
只是为了获取相应的文字,这被认为是不可取的。在特定于这些的命名空间中声明文字不会导致问题。 - 根据域的不同,可能需要使用
s
作为其他内容的后缀。已经有另一个后缀s
来表示秒,但它们并不真正冲突。
在video of STL's CppCon 2014 talk (由 remyable 在评论中发布)Stephan T. Lavavej 解释了 C++14 中文字的整体设计,并且非常清楚它们不应该在全局命名空间中!相反,标准库中的文字后缀存在于 inline
命名空间的层次结构中,使用户可以对可用的文字进行细粒度控制。例如,字符串的文字后缀声明如下(21.3 [string.classes] 第 1 段):
namespace std {
inline namespace literals {
inline namespace string_literals {
string operator"" s(char const* str, size_t len);
}
}
}
这种 inline
命名空间的层次结构使用户可以选择适当的文字后缀:
using namespace std;
- 您可以获得标准 C++ 库中的所有内容,包括文字后缀,无需任何限定。using namespace std::literals;
- 您可以获得标准 C++ 库中定义的所有文字后缀。using namespace std::string_literals;
- 您可以获得适用于字符串的所有文字后缀。using namespace std::literals::string_literals;
- 是的,你可以这样做,但你真的不应该这样做:这等同于using namespace std::string_literals;
.
很明显,如果委员会认为用文字后缀污染全局命名空间的想法是可行的,那么委员会就不会付出那么大的努力,尽管它们甚至不会与任何用户文字后缀冲突。
关于c++ - 为什么 operator""s 隐藏在命名空间中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28589863/