6

以下代码使用 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]-> 因此尝试获取1映射到的数组巨魔,程序不会编译并出现以下错误:

error C2512: 'std::array<_Ty,_Size>::array': 没有合适的默认构造函数可用

是什么导致了 gcc 和 vs11 之间的这种行为差异以及如何解决它?

谢谢。

4

2 回答 2

4

试试auto z = *x.find(1);吧。-operator[]需要一个默认的可构造类型。事实上,整个容器都需要一个默认可构造类型,所以当你尝试各种实现时,除了随机运气之外,你真的不能指望任何事情。

于 2012-05-06T00:36:53.847 回答
3

您的类型不可分配,因为它包含常量。

x[1] 尝试返回可分配的引用。如果它还不存在,它还将为键构造一个空值。这两个都对您的类型无效。您必须改用 find 。

于 2012-05-06T00:39:10.620 回答