返回const std :: string的方法是否应该返回const std :: string_view?

and*_*eee 11 c++ string string-view c++17

假设我们在类中有一个简单的getter方法,该方法返回conststd::string成员的引用:

const std::string& getString() const noexcept { return someString; }
Run Code Online (Sandbox Code Playgroud)

随着std::string_viewC ++ 17 的问世,我想知道编写它是否具有任何优势:

const std::string_view getString() const noexcept { return someString; }
Run Code Online (Sandbox Code Playgroud)

一种方法比另一种方法有优点/缺点吗?显然(如果我错了,请纠正我),两种解决方案肯定会比这更好:

const char* getString() const noexcept { return someString.c_str(); }
Run Code Online (Sandbox Code Playgroud)

我已经看到了这个相关的问题,但是我要的是稍微不同的东西。

Bar*_*rry 15

是的,您应该写:

const std::string& getString() const noexcept { return someString; }
Run Code Online (Sandbox Code Playgroud)

而不是(注意:not const,因为从不返回const值):

std::string_view getString() const noexcept { return someString; }
Run Code Online (Sandbox Code Playgroud)

原因是-您已经有一个string。因此,这并不意味着您不必付出任何额外的费用就可以string摆脱困境。并且与string任意语义上有一个显着的语义差异string_view:它以保全终止。我们知道这一点。也许某些下游用户需要依赖该信息。如果他们需要空值终止(例如,他们需要传递给需要它的C API),而您给出a string_view,则他们必须自己使用空值终止string。您什么都不做,却有可能使下游用户做更多的工作。

但是,如果您有一个vector<char>...,那么我建议返回a span<char const>或等效值。由于没有语义上的差异,因此您只提供一个视图。


还有关于以下内容的单独论点:

auto x = obj.getString();
Run Code Online (Sandbox Code Playgroud)

应该做。这要么获取string(昂贵,但安全)的副本,要么对其进行有效引用(廉价,但可能悬挂)。但是它看起来并不完全像是参考,而是看起来像一个值。这是与一般的参考语义类型广泛的问题(喜欢的东西reference_wrapperstring_viewspantuple<T&...>optional<T&>如果它存在,等等)。

对于这种情况,我没有答案,但是需要注意。

  • @ZanLynx是什么意思?`std :: string` [保证书](https://en.cppreference.com/w/cpp/string/basic_string/operator_at)基本上在[每] [https://en.cppreference.com/w / cpp / string / basic_string / data)[种类](https://en.cppreference.com/w/cpp/string/basic_string/c_str)自C ++ 11起... (2认同)