C ++社区建议不要使用using namespace std;
。但是假设你想使用字符串文字,例如auto s = "dummy"s;
。
不使用using namespace std;
导致编译失败。解决方案是什么?
答案 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_literals
和using namespace std::literals::string_literals
答案 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;
}
因此,某些库中运算符重载的可能性应该为零,因为该标准建议我们普通人应该在其后缀加一个下划线。 而且,由于我是在函数内部使用名称空间添加的,因此在其外部不会发生名称冲突的可能性。