不含显式构造函数、含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
相关产品推荐
相关产品推荐

