C++社区建议不要使用using namespace std;.但是假设你想使用字符串文字,例如auto s = "dummy"s;.不使用using namespace std;原因导致编译失败.解决办法是什么?
Rak*_*111 31
operator""s在命名空间中有2个内联命名空间std.它基本上看起来像这样:
namespace std
{
inline namespace literals
{
inline namespace string_literals
{
//operator""s implementation
//...
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,要仅获取字符串文字,请使用using namespace std::string_literals;.
Alternatevely,如果要包括所有的文字-包括字符串文字(如s几秒钟,如果你有chrono,...) using namespace std::literals;.
根据具体情况,您可能还会考虑使用:
using std::string_literals::operator""s;
Run Code Online (Sandbox Code Playgroud)
而不是从该命名空间导入每个名称.
请注意,您仍然不应将其包含在标题中,在全局级别(但您可以在内联或成员函数或您控制的名称空间内执行此操作)
Gal*_*lik 10
对于字符串文字,您可以使用:
using namespace std::string_literals;
Run Code Online (Sandbox Code Playgroud)
这会将4名称拉入命名空间,这很好.但是当你这样做时:
using namespace std;
Run Code Online (Sandbox Code Playgroud)
然后你会输入数以千计的名字,其中许多名字常用于count和time.这可能会因为意外地引用错误的东西而难以找到错误.
这不是字符串文字的问题.
此外,所引入的名称都不会using namespace std::string_literals;干扰用户定义的名称,因为用户定义的字符串文字必须以_(根据标准)开头,以避免冲突.
但是,您仍应避免using namespace std::string_literals;在头文件的全局命名空间中使用,因为您不应对未请求的用户强加任何功能.