Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否进行实验::基本字符串视图<&燃气轮机;与右值一起工作?_C++_C++11_C++17_String View - Fatal编程技术网

C++ 是否进行实验::基本字符串视图<&燃气轮机;与右值一起工作?

C++ 是否进行实验::基本字符串视图<&燃气轮机;与右值一起工作?,c++,c++11,c++17,string-view,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::

我不是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';
}
#包括
#包括
int main()
{
std::string str=“左值字符串”;
标准::实验::字符串\视图\左值(str);
std::experimental::string_view_rvalue(std::string{“rvalue string”});

如果cppreference是正确的,那么这就是UB.has

典型的实现只包含两个成员:指向常量
图表的指针和
大小的指针

而构造函数

构造字符数组的第一个
str.size()
字符的视图,从
str.data()
指向的元素开始

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


正如评论中指出的,允许这种行为的一个原因是,您可以将
字符串视图
传递给函数,并从临时
字符串

@vsoftco编写一个LWG问题:)@vsoftco确实如此,但仔细想想,禁止右值可能会显著降低f的可用性函数使用字符串视图参数。请注意,确实明确禁止在各种情况下使用右值,正是因为这个原因。当然,正如T.C.所指出的,这使得在某些情况下很难使用右值;您必须创建一个显式临时值。@vsoftco右值应该存在到表达式结束并让函数执行为止而且return是表达式的一部分,所以右值应该一直处于活动状态。@Nicolas iirc string_span是读写的。所以它有点像非常量/常量左值引用。