gpt4 book ai didi

c++ - 传递临时 std::string 时的 string_view 行为

转载 作者:可可西里 更新时间:2023-11-01 15:51:12 25 4
gpt4 key购买 nike

我只是遇到了一些误解:至少在 libc++ 实现中,std::experimental::string_view 具有以下简洁的实现:

template <class _CharT, class _Traits....>
class basic_string_view {
public:
typedef _CharT value_type;
...
template <class _Allocator>
basic_string_view(const basic_string<_CharT, _Traits, _Allocator>& str):
__data(str.data()), __size(str.size())
{
}

private:
const value_type* __data;
size_type __size;
};

这个实现是否意味着如果我们将右值表达式传递给这个构造函数,我们在构造后使用 __data 时会得到未定义的行为?

最佳答案

没错。 string_view 是具有引用语义的非拥有包装器,只有在引用的字符串超过 View 的使用期限时才必须使用。

典型的用例是在函数参数中,实际字符串在函数调用期间存在,函数体从不存储 View ,而只是读取它:

void foo(std::experimental::string_view message)  // pass by value
{
std::cout << "You said, '" << message << "'.\n";
}

用法:

foo("Hello");       // OK, string literal has static storage
foo(s); // OK, s is alive
foo(s.substr(1)); // OK, temporary lives until end of full-expression

道德是:如果你只需要函数体持续时间的字符串,给函数一个 string_view 参数,它可以统一绑定(bind)到任何类型的 stringoid 参数。您不需要函数模板,复制 string_view 很便宜,而且您可以免费获得一些简洁的子串操作。相比之下,从不存储 string_view,但始终存储string:

struct X
{
X(std::experimental::string_view s) : s_(s) {}

std::string s_; // NEVER have a string_view class member!
};

关于c++ - 传递临时 std::string 时的 string_view 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26978266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com