unordered_map - {{key,value},{key,value}}语法无效

时间:2013-04-02 14:06:20

标签: c++ visual-c++ c++11 visual-studio-2012 std

我正在尝试编译the code taken from here

// constructing unordered_maps
#include <iostream>
#include <string>
#include <unordered_map>

typedef std::unordered_map<std::string,std::string> stringmap;

stringmap merge (stringmap a,stringmap b) {
  stringmap temp(a); temp.insert(b.begin(),b.end()); return temp;
}

int main ()
{
  stringmap first;                              // empty
  stringmap second ( {{"apple","red"},{"lemon","yellow"}} );       // init list
  stringmap third ( {{"orange","orange"},{"strawberry","red"}} );  // init list
  stringmap fourth (second);                    // copy
  stringmap fifth (merge(third,fourth));        // move
  stringmap sixth (fifth.begin(),fifth.end());  // range

  std::cout << "sixth contains:";
  for (auto& x: sixth) std::cout << " " << x.first << ":" << x.second;
  std::cout << std::endl;

  return 0;
}

使用MSVC2012但我收到了

  

错误C2143:语法错误:在'{'

之前缺少')'
代码行上的

stringmap second ( {{"apple","red"},{"lemon","yellow"}} );       // init list

我错过了什么吗?

3 个答案:

答案 0 :(得分:5)

Visual Studio 2012缺少许多现代C ++功能,其中包括initialiser lists。有关概述,请参阅here

答案 1 :(得分:4)

您的代码没有任何问题,并且它与GCC和Clang编译良好。问题出在Visual C ++上。

初始化列表是 Visual Studio 2012 Update 2 中提供的功能之一。这意味着目前不能使用此功能在Visual Studio 2012有一系列Community Tech Previews (CTP),但他们提出了一些小问题,包括缺少的IntelliSense支持和清晰的免责声明说,他们的目的不是用于生产代码。

因此,简而言之:您的代码是正确的,但在Microsoft发布Visual Studio 2012 Update 2之前,它无法在VS2012中编译。无法确定何时会出现这种情况,但Visual Studio 2012于2012年8月首次发布,最后一次更新(更新1)于2012年11月发布。从那以后,关于这个问题的消息很少,但自去年年底以来一直在“即将推出”。

<强>更新 现在,Update 2已经发布。但是,它不包括来自Update 2 CTP的承诺的C ++改进的任何。这很有趣,考虑到它们应该是Update 2中预览的预览。显然,Visual C ++团队“目前正在最终确定这些功能的发布计划”“将很快分享更多细节“。 (来自Update 2 release announcement的评论。)

答案 2 :(得分:2)

为了更准确,初始化程序列表在VS2012 CTP中有特色,但该更新尚未发布,并且不包含对标准库中的初始化程序列表的支持 - IOW,它们很接近,但微软没有完了它们。