gpt4 book ai didi

c++ - experimental::basic_string_view<> 是否适用于右值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:54 25 4
gpt4 key购买 nike

我不是 100% 确定以下代码在语义上是正确的:

#include <iostream>
#include <experimental/string_view>

int main()
{
std::string str = "lvalue string";

std::experimental::string_view view_lvalue(str);
std::experimental::string_view view_rvalue(std::string{"rvalue string"});

std::cout << view_lvalue << '\n' << view_rvalue << '\n';
}

Live on Wandbox

问题:我可以合法地将右值绑定(bind)到 std::experimental::basic_string_view 吗? ,还是只是 UB?如果是,它是如何工作的?据我所知,右值不会通过构造函数绑定(bind)到 const 引用(我假设 View 持有原始字符串),所以我认为在语句的末尾 std::experimental::string_view view_rvalue(std::string{"rvalue string"}); 引用将悬空。 string_view 是否使用更复杂的方法?

我问这个是因为我正在尝试为某个矩阵类编写类似的 View ,但还不知道如何处理右值(我当然可以禁用它们,但我认为这不是最好的方法).

最佳答案

如果 cpprence 是正确的,那么这是 UB。 std::string_view

A typical implementation holds only two members: a pointer to constant CharT and a size.

构造函数有

Constructs a view of the first str.size() characters of the character array starting with the element pointed by str.data().

因此,如果 string_view 只是指向所提供字符串的底层 char 数组,那么一旦表达式结束并且临时对象被销毁,我们就会有一个悬空指针。

正如评论中所指出的,可能允许此行为的一个原因是您可以将 string_view 传递给函数并从临时 构造该 string_view >字符串

关于c++ - experimental::basic_string_view<> 是否适用于右值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35090090/

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