在C ++ 17中使用const std :: string&参数是否有意义?

bar*_*top 25 c++ c++17

通过string_view使用C ++ 17,我们得到了一种便宜的方法,该方法将std::string和传递char*给不占用字符串所有权并避免制作临时副本的函数。通过使用std::string按值传递,std::move我们可以为r值和l值引用显式快速地传递字符串所有权。

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

Hol*_*Cat 28

是。

问题std::string_view在于它不记得它是否指向以null终止的字符串。

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

  • @StaceyGirl,我们面对的是C ++复杂性爆炸的情况 (17认同)
  • @StaceyGirl这是否意味着C ++ 17标准库的许多部分(例如异常)未正确编写C ++ 17代码? (3认同)
  • @wrtlprnft标准异常不接收`string_view`构造函数,而仅具有`const char *`/`const std :: string&`构造函数,因此,如果要从派生类传递`string_view`,则必须创建一个附加的字符串副本-应该在减少重载次数的同时避免使用string_view。 (3认同)
  • 究竟。正确编写的C ++ 17代码应为const char *,const std :: string&和std :: string_view提供重载。尤其是因为标准库的许多部分都没有获得`string_view`支持(例如例外)。 (2认同)
  • 另外,我非常确定,如果人们对微性能感到非常担心,则`std :: string_view`会更慢。并不重要,但确实应该慢一些。传递“ string const&”将使字符串对象成为别名(在最坏的情况下为指针),在平均情况下为“ no op”。传递一个string_view会调用操作符string_view来初始化NRVO复制的string_view,它会初始化一个指针和一个大小。当给定一个const char *而不是string时,它将被称为strlen,所以... (2认同)