是experimental :: basic_string_view<>与右值一起工作?

时间:2016-01-29 17:04:38

标签: c++ c++11 c++17 string-view

我不是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

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

我问的是因为我试图为某些矩阵类写一个类似的观点,而且还不知道如何处理右值(我当然可以禁用它们,但我不认为这是最好的方法。

1 个答案:

答案 0 :(得分:3)

如果cpprefernce正确则这是UB。 std::string_view

  

典型的实现仅包含两个成员:指向常量CharTsize的指针。

构造函数有

  

构造一个以str.size()指向的元素开头的字符数组的第一个str.data()个字符的视图。

因此,如果string_view只指向提供的字符串的基础char数组,那么一旦表达式结束并且临时被销毁,我们将有一个悬空指针。

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