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

时间:2016-08-15 06:01:08

标签: c++ c++11

C ++社区建议不要使用using namespace std;。但是假设你想使用字符串文字,例如auto s = "dummy"s;。 不使用using namespace std;导致编译失败。解决方案是什么?

4 个答案:

答案 0 :(得分:28)

operator""s位于命名空间std中的2个内联命名空间中。它基本上是这样的:

namespace std
{
    inline namespace literals
    {
        inline namespace string_literals
        {
            //operator""s implementation
            //...
        }
    }
}

因此,要仅获取字符串文字,请使用using namespace std::string_literals;

或者,如果你想要包含每个文字 - 包括字符串文字(如s,如{}包含chrono,那么......):{{1 }}

根据具体情况,您也可以考虑使用:

using namespace std::literals;

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

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

答案 1 :(得分:3)

上面的运算符在namespace std::literals::string_literals中声明,其中literals和string_literals都是内联命名空间。使用命名空间std :: literals,using namespace std::string_literalsusing namespace std::literals::string_literals

可以获得对这些运算符的访问权限

来源:std::literals::string_literals::operator""s

答案 2 :(得分:0)

我认为这是简单的方法。在C ++ 14中工作正常。 compiler explorer

#include <string>
#include <chrono>

int main()
{
  using std::operator""s;
  auto str = "abc"s;
  auto min = 60s;
}

答案 3 :(得分:0)

我将在代码块中添加“ using namespace”(使用命名空间):

auto get_greetings()
{
    using namespace std::string_literals;
    return "Hello world"s;
}

因此,某些库中运算符重载的可能性应该为零,因为该标准建议我们普通人应该在其后缀加一个下划线。 而且,由于我是在函数内部使用名称空间添加的,因此在其外部不会发生名称冲突的可能性。