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

标签 c++ c++14

为了对std::string 使用operator""s,您必须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""s 隐藏在命名空间中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28589863/

相关文章:

c++ - 使用通用接口(interface)查找序列的大小

c++ - 如何在ChaiScript 中注册重载的模板成员函数?

c++ - 可调用结果类型的推导

c++ - 有没有办法部分匹配可变参数模板参数包?

c++ - 通过具有模板专长的基类以const方法调整本地容器的大小

c++ - 如何模板化静态工厂方法?

c++ - STL容器按优先级弹出()?

c++ - 使用 CreateProcess 执行 rundll32.exe

c++ - 为什么我的 "string mingling"方法返回意外结果?

c++ - 有什么方法可以匹配 C++ 中的字符串集吗?