gpt4 book ai didi

c++ - 为什么 operator""隐藏在命名空间中?

转载 作者:IT老高 更新时间:2023-10-28 13:01:07 25 4
gpt4 key购买 nike

为了将 operator""s 用于 std::string,您必须执行 using namespace std::string_literals。但是不以 _ 开头的用户定义的文字是保留的,因此可能的冲突不能成为借口。另一个 operator""s 来自 std::chrono 但这是针对 int 文字的,因此那里也没有冲突。

这是什么原因?

最佳答案

将文字放入命名空间实际上有两个原因:

  1. 不希望用户使用 using namespace std; 只是为了获取相应的文字。在特定于这些的命名空间中声明文字不会导致问题。
  2. 根据域的不同,可能需要使用 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""隐藏在命名空间中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27556504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com