【问题标题】:Does experimental::basic_string_view<> work with rvalues?Experimental::basic_string_view<> 是否适用于右值?
【发布时间】:2016-01-29 17:04:37
【问题描述】:

我不是 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?如果是,它是如何工作的?据我所知,右值不会通过构造函数绑定到 const 引用(我假设视图保留原始字符串),所以我认为在语句的末尾 std::experimental::string_view view_rvalue(std::string{"rvalue string"}); 引用将是悬空。 string_view 是否使用更复杂的方法?

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

【问题讨论】:

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


    【解决方案1】:

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

    一个典型的实现只包含两个成员:一个指向常量CharT 的指针和一个size

    而构造函数有

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

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

    正如 cmets 中指出的,可能允许这种行为的一个原因是,您可以将 string_view 传递给函数并从临时 string 构造 string_view

    【讨论】:

    • @vsoftco 写一个 LWG 问题 :)
    • @vsoftco 确实如此,但再三考虑禁止右值可能会显着降低采用字符串视图参数的函数的可用性。
    • 请注意similar GSL type string_span 明确禁止在各种情况下使用右值,正是出于这个原因。当然,这使得它在某些情况下难以使用,如 T.C.指出;你必须创建一个明确的临时。
    • @vsoftco 右值应该一直存在到表达式的末尾,并且让函数执行和返回是表达式的一部分,因此右值应该一直处于活动状态。
    • @NicolBolas iirc string_span 是可读写的。所以它有点像非 const/const 左值引用。
    猜你喜欢
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多