and*_*eee 11 c++ string string-view c++17
假设我们在类中有一个简单的getter方法,该方法返回const对std::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_wrapper,string_view,span,tuple<T&...>,optional<T&>如果它存在,等等)。
对于这种情况,我没有答案,但是需要注意。
| 归档时间: |
|
| 查看次数: |
362 次 |
| 最近记录: |