以下代码使用gcc-4.5.1编译,但不在Visual Studio 11中编译。
#include <map>
#include <array>
typedef std::pair<const unsigned int, std::array<const unsigned int, 4>> pairus;
int main(){
std::map<const unsigned int, std::array<const unsigned int, 4> > x;
std::array<const unsigned int, 4> troll = {1, 2, 3, 4};
x.insert(pairus(1, troll));
auto z = x[1];
}
1现在映射到std::array<> troll
。插入效果很好,程序编译。但是,只要我尝试auto z = x[1]
- &gt;因此,尝试获取1
映射到的数组troll时,程序无法编译并出现以下错误:
error C2512: 'std::array<_Ty,_Size>::array'
:没有合适的默认构造函数
是什么导致gcc和vs11之间的行为差异以及如何修复它?
感谢。
答案 0 :(得分:4)
请尝试使用auto z = *x.find(1);
。 []
- 运算符需要默认可构造类型。实际上,整个容器需要一个默认构造类型,所以当你尝试各种实现时,你真的不能指望任何东西,而是随机运气。
答案 1 :(得分:3)
您的类型不可分配,因为它包含常量。
x [1]尝试返回可分配的引用。如果密钥尚未存在,它还将为密钥构造一个空值。这两种都不适用于您的类型。你将不得不使用find。