【问题标题】:Is there sense in using const std::string& arguments in C++17?在 C++17 中使用 const std::string& 参数是否有意义?
【发布时间】:2020-01-16 23:55:50
【问题描述】:

通过在 C++17 中获取string_view,我们获得了将std::stringchar* 传递给不获取字符串所有权并避免制作临时副本的函数的廉价方法。通过使用按值传递的std::stringstd::move,我们可以显式且快速地传递右值和左值引用的字符串所有权。

我的问题是:在新的 C++ 标准中使用const std::string& 作为任何函数参数有什么好处吗?

【问题讨论】:

标签: c++ c++17


【解决方案1】:

是的。

std::string_view 的问题在于它不记得它是否指向一个以 null 结尾的字符串。

如果您正在为使用空终止字符串的 C api 编写包装器,则必须不断将您的 std::string_views 复制到 std::strings 以确保您有空终止符。

【讨论】:

  • 没错。正确编写的 C++17 代码应该为 const char *const std::string &std::string_view 提供重载。特别是因为标准库的许多部分没有获得string_view 支持(例如例外)。
  • @StaceyGirl 我们又来了,C++ 复杂性在用户面前爆炸式增长
  • 另外,我很确定std::string_view 会更慢,如果一个人非常担心微性能。这并不重要,但它确实应该慢一些。传递string const& 将给字符串对象起别名,在最坏的情况下它是一个指针,在一般情况下是“无操作”。传递string_view 调用operator string_view 来初始化一个NRVO 复制的string_view,它初始化一个指针和一个大小。当给定 const char* 而不是 string 时,它将调用 strlen,所以...
  • @StaceyGirl 这是否意味着 C++17 标准库的许多部分,例如异常,都没有正确编写 C++17 代码?
  • @wrtlprnft 标准异常没有接收string_view构造函数,只有const char */const std::string &,所以如果你想从派生类传递string_view,你将拥有创建一个额外的字符串副本 - string_view 在减少重载数量的同时应该避免的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
相关资源
最近更新 更多