experimental::basic_string_view<> 是否适用于右值?
Does experimental::basic_string_view<> work with rvalues?
我不是 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';
}
问题: 我可以合法地将右值绑定到 std::experimental::basic_string_view,还是只是 UB?如果是,它是如何工作的?据我所知,右值不会通过构造函数绑定到 const
引用(我假设视图持有原始字符串),所以我认为在语句的末尾 std::experimental::string_view view_rvalue(std::string{"rvalue string"});
参考将悬空。 string_view
是否使用更复杂的方法?
我问这个是因为我正在尝试为某个矩阵编写类似的视图 class,并且还不知道如何处理右值(我当然可以禁用它们,但我不知道不认为这是最好的方法)。
如果 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
[ 构造 string_view
=22=]
我不是 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';
}
问题: 我可以合法地将右值绑定到 std::experimental::basic_string_view,还是只是 UB?如果是,它是如何工作的?据我所知,右值不会通过构造函数绑定到 const
引用(我假设视图持有原始字符串),所以我认为在语句的末尾 std::experimental::string_view view_rvalue(std::string{"rvalue string"});
参考将悬空。 string_view
是否使用更复杂的方法?
我问这个是因为我正在尝试为某个矩阵编写类似的视图 class,并且还不知道如何处理右值(我当然可以禁用它们,但我不知道不认为这是最好的方法)。
如果 cpprence 是正确的,那么这是 UB。 std::string_view
有
A typical implementation holds only two members: a pointer to constant
CharT
and asize
.
并且构造函数有
Constructs a view of the first
str.size()
characters of the character array starting with the element pointed bystr.data()
.
因此,如果 string_view
仅指向所提供字符串的底层 char 数组,那么一旦表达式结束并且临时对象被销毁,我们就会有一个悬空指针。
正如评论中所指出的,这种行为可能被允许的一个原因是您可以将 string_view
传递给函数并从临时 string
[ 构造 string_view
=22=]