【问题标题】:operator suffix for std::string in c++14c++14中std::string的运算符后缀
【发布时间】:2014-01-10 17:50:00
【问题描述】:

我安装了 Clang 3.4,并测试字符串文字 ""s 的后缀运算符。

#include <string>

//1. using namespace std; // without compile error.
//2. using std::operator ""s; // or without it compile error, too.
// for success compiles, need 1. or 2. line.

int main()
{
    auto s = "hello world"s; 
}

如果我评论 1 和 2 ,我会得到编译错误。但我知道在大项目中 1.-方法不好, 和 2.-method 比较陌生。

QA:我可以在不写using namespace stdusing std::operator ""s 的情况下使用运算符“”吗?

【问题讨论】:

  • "2.-方法是陌生的。"为什么你觉得这很奇怪?对我来说看起来很自然。
  • 简答:不,你不能。这就是它的意图,Clang 要求 1. 或 2 是正确的。看起来你对此并不满意,并想质疑它是如何定义的决定,但这不是一个适合 SO 的 Q。
  • 这到底是什么...我们真的需要using 才能使文字后缀起作用?头脑难以置信。
  • 这些操作符已经定义在一个内联命名空间中,所以你也可以使用using namespace std::literals::string_literals;(例如在你使用它们的函数内部)
  • using namespace std::literals 也可以。

标签: c++ c++11 c++14


【解决方案1】:

结束 cmets:

您必须使用using 显式引入这些运算符。这就是标准的意图。你也应该考虑只提取你需要的东西

using namespace std::literals;

using namespace std::literals::string_literals;

根据您的需要,后者在有疑问时更可取(只提取您需要的,而不是更多)。与所有 using 声明或指令一样,您希望将它们限制在可行的最小范围内。

需要显式引入运算符的原因是后缀可能会在不同上下文中的未来扩展中重复使用。

【讨论】:

  • std::literals;和 std::literals::string_literals;是标准内联命名空间还是仅用于编译器实现命名空间?
  • @Khurshid 它们是标准化的,因此是可移植的。请参阅“标题&lt;string&gt; 概要”末尾的“§21.3 字符串类 [string.classes]”。
  • @Khurshid 他们将这些namespaces inline 标准化,以便using std; 引入文字运算符。其他结果令人惊讶。
  • @DanielFrey:考虑 auto s = "hello world"s; std::cout
  • @PravasiMeet 是的,保证
【解决方案2】:

如果您发现第二个选项很奇怪,这实际上很常见,您可以像这样限制“using namespace std”的范围:

int main()
{
    using namespace std;
    auto s = "hello world"s; 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多