使用字符串文字而不使用命名空间std

E. *_*ili 27 c++ c++11

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)

而不是从该命名空间导入每个名称.

请注意,您仍然不应将其包含在标题中,在全局级别(但您可以在内联或成员函数或您控制的名称空间内执行此操作)

  • @ E.Vakili我想你可以`使用std :: string_literals :: operator""s;` (3认同)
  • 如果它位于他控制的命名空间内,他也可以在标头中使用它。(不在全球范围内)。否则,将不可能在标准功能之上编写库。 (3认同)
  • 为什么这是公认的答案?引用的问题是"不使用命名空间......"而是能够使用它.我更喜欢明确使用完整的命名空间范围,例如`std :: cout <<"hello world"<< std :: endl`.如何在没有`using namespace std :: string_literals`的情况下使用`operator""s`? (3认同)
  • 为什么我们不能使用像`using std :: string_literals :: s;`这样的东西? (2认同)
  • @EmilioGaravaglia我不同意.如果我在我的源文件中包含一个头文件,然后使用`using namespace`,我不希望从我没有使用的名称空间中获取头名称. (2认同)
  • @ Rakete1111:如果使用命名空间X,则使用属于它的所有名称,包括该命名空间X的作者在其中导入的名称.没有名字冲突的风险,因为它已经发生了冲突.这是合同的一部分.您无法确定不属于您的域名空间内必须包含的内容. (2认同)

Gal*_*lik 10

对于字符串文字,您可以使用:

using namespace std::string_literals;
Run Code Online (Sandbox Code Playgroud)

这会将4名称拉入命名空间,这很好.但是当你这样做时:

using namespace std;
Run Code Online (Sandbox Code Playgroud)

然后你会输入数以千计的名字,其中许多名字常用于counttime.这可能会因为意外地引用错误的东西而难以找到错误.

这不是字符串文字的问题.

此外,所引入的名称都不会using namespace std::string_literals;干扰用户定义的名称,因为用户定义的字符串文字必须_(根据标准)开头,以避免冲突.

但是,您仍应避免using namespace std::string_literals;头文件的全局命名空间中使用,因为您不应对未请求的用户强加任何功能.