C++ 是否进行实验::基本字符串视图<&燃气轮机;与右值一起工作?
我不是100%认为以下代码在语义上是正确的: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::
#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是读写的。所以它有点像非常量/常量左值引用。