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

不含显式构造函数、含std::variant数组的结构体能否按值返回?

问题分析与解决方法

你的代码报错的核心原因是:std::variant<int[5], float[4]>里的模板参数是原始数组类型,而原始数组本身不支持拷贝操作,这会导致std::variant的拷贝构造函数被编译器自动删除。你的TestStruct2没有显式定义拷贝构造函数,编译器会尝试生成隐式拷贝构造函数,但因为成员t的拷贝构造不可用,结构体的拷贝构造函数也被标记为删除——返回值时需要调用拷贝构造(即使编译器可能做返回值优化,也会先检查该函数是否合法),最终触发错误。

不需要写显式构造函数的解决方法很简单,把原始数组换成std::array即可:std::array是对原始数组的封装,提供了完整的拷贝、移动等语义支持。

修改后的代码如下:

#include <variant>
#include <array>

struct TestStruct2
{
    std::variant<std::array<int, 5>, std::array<float, 4>> t;
};

TestStruct2 test2()
{
    TestStruct2 t;
    return t;
}

这样修改后,std::variant的成员是可拷贝的std::array,编译器就能正常为TestStruct2生成隐式拷贝构造函数,按值返回操作也能正常通过编译。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 05:54:20