为何单个Derived可转为Base,但std::array<Derived>无法转std::array<Base>?
为何
std::array<Derived>无法隐式转换为std::array<Base> 问题代码
#include <array> struct Base {}; struct Derived : Base {}; void f_one(Base & foo) {} void f_array(std::array<Base, 2> foo) {} int main() { Derived a; f_one(a); // 正常编译:Derived可隐式转换为Base& std::array<Derived, 2> b = {}; f_array(b); // 编译报错 return 0; }
编译错误
no known conversion from 'array<Derived, [...]>' to 'array<Base, [...]>' for 1st argument
原因解析
- 模板实例是独立类型:
std::array<Derived, 2>和std::array<Base, 2>是编译器生成的两个完全独立的类型,彼此没有继承或预设转换关系。单个Derived对象能转Base是C++原生支持的派生类到基类的隐式转换,但这种规则不会自动延伸到模板容器的实例上。 - 内存布局不匹配:
std::array是直接存储元素的聚合类型,内部元素的大小、内存布局由模板参数决定。如果Derived包含Base没有的成员,std::array<Derived,2>的总大小会比std::array<Base,2>大,强行转换会导致内存越界、对象切片等未定义行为,因此编译器禁止这种隐式转换。
解决方法
你需要手动将std::array<Derived,2>转换为std::array<Base,2>,比如逐个元素复制构造:
std::array<Base, 2> converted_b; std::copy(b.begin(), b.end(), converted_b.begin()); f_array(converted_b);
或者直接在调用时构造新数组:
f_array({b[0], b[1]});
内容的提问来源于stack exchange,提问作者Francisco Leon
相关产品推荐
相关产品推荐

