使用字符串文本而不使用命名空间std P> > C++社区中有推荐使用名称空间STD不使用;。但是假设您想要使用字符串文本,例如auto s=“dummy”s。 不使用使用名称空间std导致编译失败。解决方案是什么?

使用字符串文本而不使用命名空间std P> > C++社区中有推荐使用名称空间STD不使用;。但是假设您想要使用字符串文本,例如auto s=“dummy”s。 不使用使用名称空间std导致编译失败。解决方案是什么?,c++,c++11,C++,C++11,位于命名空间std中的两个内联命名空间中。基本上是这样的: namespace std { inline namespace literals { inline namespace string_literals { //operator""s implementation //... } } } 因此,要仅获取字符串文本,请使用usingnamespace std::str

位于命名空间
std
中的两个内联命名空间中。基本上是这样的:

namespace std
{
    inline namespace literals
    {
        inline namespace string_literals
        {
            //operator""s implementation
            //...
        }
    }
}
因此,要仅获取字符串文本,请使用
usingnamespace std::string\u文本

或者,如果您希望包含每个文本-包括字符串文本(如
s
,如果包含
chrono
,…),请使用命名空间std::literals:

根据情况,你也可以考虑使用:

using std::string_literals::operator""s;
而不是从该名称空间中导入每个名称

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

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

using namespace std::string_literals;
这将把大约
4个
名称放入名称空间,这很好。但当你这样做的时候:

using namespace std;
然后你输入数千个名字,其中许多常用于
count
time
等程序中。这可能会由于意外引用错误的内容而产生难以发现的bug

这不是字符串文本的问题

也没有使用名称空间std::string_文本的
名称引入应该会干扰用户定义的名称,因为用户定义的字符串文本必须
开头(根据标准),这样可以避免冲突


但是,您仍然应该避免使用命名空间std::string_文本
在头文件的全局名称空间中,因为您不应将用户未请求的任何功能强加于用户。

上述运算符在
名称空间std::literals::string\u literals
中声明,其中literals和string\u literals都是内联名称空间。使用命名空间std::literals、
使用命名空间std::string_literals和
使用命名空间std::literals::string_literals可以访问这些运算符

来源:

我会在我的代码块中添加“使用名称空间”的内容:

auto get_greetings()
{
    using namespace std::string_literals;
    return "Hello world"s;
}
因此,在某些库中重载运算符“”的概率应该为零,因为标准建议我们普通人应该添加带下划线的后缀。
而且,由于我是在函数中使用名称空间添加此函数,因此在函数外部不会发生名称冲突。

但是,这不应该在头中的名称空间范围内使用。为什么我们不能使用类似
使用std::string\u literals::s
?@E.Vakili我想您可以使用std::string\u literals::operator“s@EmilioGaravaglia我不同意。如果我在源文件中包含一个头文件,然后使用
使用名称空间
,我不希望从我不使用的名称空间中导入头文件名。@Rakete1111:如果使用名称空间X,则使用该名称空间中的所有名称,包括该名称空间X的作者在其中导入的名称。不存在名称冲突的风险,因为名称冲突已经存在。这是合同的一部分。你无法决定非你的名称空间中必须包含的内容。为什么这是公认的答案?引用的问题是不“使用名称空间…”但却能够使用它。我更喜欢显式地使用完整的名称空间范围,比如
std::cout。解决方案可能是在询问之前搜索引用信息,在像cppreference这样的网站上,这个问题中谁的不匹配引用是一个拼写错误还是一些模糊的功能?@plugwash,它不是模糊的,它是新的。你上面的评论将向那些不理解这个问题的人解释。好吧,@underline_d,我认为这是一个非常适合StackOverflow的问题,一个有效的答案在2021年仍然对人们有帮助。@PavelŠimerda是的,我倾向于同意;我感觉不像2016年那样。但既然我的评论被引用了,我就不提了,以免引起混淆。