代码之家  ›  专栏  ›  技术社区  ›  Tom Huntington

推论:共生成的字符串_视图挂起了吗?

  •  1
  • Tom Huntington  · 技术社区  · 2 年前

    我想把共屈服字符串文字和 std::strings

    Generator<std::string_view> range(int first, const int last) {
        while (first < last) {
            char ch = first++;
            co_yield " | ";
            co_yield std::string{ch, ch, ch};
        }
    }
    

    然而,我想知道std::string的寿命是多少?

    如果你知道你要消费 string_view 立即

    for(auto sv : range(65, 91))
       std::cout << sv;
    

    https://godbolt.org/z/d5eoP9aTE

    你可以这样安全

    Generator<std::string_view> range(int first, const int last) {
        std::string result;
        while (first < last) {
            char ch = first++;
            co_yield " | ";
            result = std::string{ch, ch, ch};
            co_yield result;
        }
    }
    
    1 回复  |  直到 2 年前
        1
  •  6
  •   Nicol Bolas    2 年前

    co_yield 是的一种奇特形式 co_await 。这两个都是表达式。因此,它们遵循表达规则。表现为表达评价一部分的临时性将继续存在,直到整个表达完成。

    co-await 表达式不 完成 直到合作关系恢复之后。这很重要,就像你经常做的那样 co-await 关于prvalues,所以如果你做一些简单的事情 co_await some_function() ,您需要的返回值 some_function 继续存在,因为它 await_resume 函数需要能够被调用。

    如前所述, 共产量 只是一种奇特的形式 co-await 。所以规则仍然适用。所以任何 string_view 生成器返回的对象将指向有效值 之间 呼吁恢复郊游。

    推荐文章