为了你的使用operator""s而std::string必须这样做using namespace std::string_literals.但是不_保留用户定义的文字是保留的,因此可能的冲突不能成为借口.另一个operator""s来自std::chrono但是那是int文字,所以也没有冲突.
这是什么原因?
Die*_*ühl 22
将文字放入命名空间实际上有两个原因:
using namespace std;仅仅想要获取相应的文字被认为是不合需要的.在特定于这些的名称空间中声明文字不会导致问题.s其用作其他内容的后缀.已有另一个后缀s表示秒,但它们并不真正冲突.在STL的CppCon 2014演讲的视频中(由评论中的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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这种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;.显然,如果委员会认为这个想法可以用文字后缀污染全局命名空间,那么委员会就不会付出太多努力,尽管它们甚至不能与任何用户文字后缀冲突.
| 归档时间: |
|
| 查看次数: |
1640 次 |
| 最近记录: |