为何C++中std::pair<int[6],int[6]>无法编译?原因解析
问题:C++用std::pair存储原生数组编译失败的原因分析
测试代码
#include <utility> int main() { int x[6]; int y[6]; std::pair<int[6], int[6]> a(x, y); return 0; }
MSVC报错信息
error C2661: 'std::pair<int [6],int [6]>::pair': no overloaded function takes 2 argument
根本原因解析
数组退化与模板参数的矛盾:C++中,原生数组作为模板参数时,编译器会偷偷把
int[6]这类数组类型调整为int*指针类型,但你显式声明的std::pair<int[6], int[6]>模板参数仍会被标记为数组类型。此时构造函数需要接收数组类型的参数,可实际传递的数组名已经退化成指针,类型不匹配。原生数组无值语义:C++原生数组不是可复制的类型,无法以值的形式传递给函数或构造函数。当你尝试用
x、y初始化std::pair时,传递的本质是int*指针,而std::pair<int[6], int[6]>的构造函数没有能接收两个int*的重载版本。std::pair的类型适配限制:
std::pair的构造函数仅支持具备值语义的类型(比如基本类型、类对象、指针等),原生数组不属于这类。即使数组退化成指针,模板参数声明的数组类型和实际传递的指针类型无法被编译器自动匹配,最终导致找不到合适的构造函数。
内容的提问来源于stack exchange,提问作者ConnellyM
相关产品推荐
相关产品推荐

