You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于std::generator的Yielded类型疑问:测试断言失败原因

std::generator Yielded类型断言失败问题

根据cppreference的定义,std::generator的Yielded类型定义如下:

using Yielded = conditional_t<is_reference_v<Reference>, Reference, const Reference&>;

我编写了如下测试代码:

#include <generator>
#include <string>

template <typename T> std::generator<T> my_gen_T()
{
    std::string value("value ");
    co_yield value;
}

void test_gen_ref()
{
    auto my_gen_instance = my_gen_T<std::string&>();
    for (auto&& elem : my_gen_instance)
    {
        static_assert(std::is_same_v<std::string&, decltype(elem)>); //OK
    }
}

void test_gen_const_ref()
{
    auto my_gen_instance = my_gen_T<const std::string&>();
    for (auto&& elem : my_gen_instance)
    {
        static_assert(std::is_same_v<const std::string&, decltype(elem)>); //OK
    }
}

void test_gen_value()
{
    auto my_gen_instance = my_gen_T<std::string>();
    for (auto&& elem : my_gen_instance)
    {
        static_assert(std::is_same_v<const std::string&, decltype(elem)>); //FAILED
    }
}

int main()
{
}

其中test_gen_value函数中的static_assert断言失败,编译器版本为Windows下的GCC 14.1.0,请问哪里出错了?


问题出在GCC 14.1.0的std::generator实现与cppreference文档描述的差异。

按照cppreference的定义,当std::generator的模板参数为值类型(如std::string)时,Yielded类型应为const Reference&(即const std::string&),但GCC的实际实现中,迭代器解引用返回的是右值引用(std::string&&),这直接导致你的断言失败。

你可以将断言修正为匹配实际返回类型:

static_assert(std::is_same_v<std::string&&, decltype(elem)>);

补充说明:当用值类型实例化std::generator时,co_yield的对象会被复制到generator的内部存储中,迭代时返回该副本的右值引用,这样设计是为了允许调用方通过移动操作优化性能。

内容的提问来源于stack exchange,提问作者Pavel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:11:14