使用字符串文本而不使用命名空间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年那样。但既然我的评论被引用了,我就不提了,以免引起混淆。