如何在Visual Studio中启用C++0x功能?[初始化器列表支持]

28

我曾在Ubuntu上编写了一些代码,现在我正在尝试在Windows 7 (MS VS 2010)上进行编译。

vector<float> tmp;
....
tmp = {3.0,4.5,9.4};

这让我遇到了语法错误

error C2143: syntax error : missing ';' before '{'

是因为Visual Studio不支持这个特性吗?还是我需要在属性中启用某些开关?我的"Platform Toolset"属性设置为"v100"。

谢谢。


3
关于当前编译器对C++0x的支持情况,请参考Apache stdcxx的页面:http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport - 只有GCC 4.4+支持初始化列表。 - wkl
3个回答

33

在Visual Studio 2010 C++编译器上,默认启用了C++0x功能。例如使用lambdas,auto等不需要任何额外的开关。如果您遇到错误,很可能是因为它不被支持。

编辑

根据此MSDN文章,初始化列表不是2010年支持的六个功能之一。

Visual Studio 2010中的Visual C++编译器启用了六个C++0x核心语言功能:lambda表达式、auto关键字、rvalue引用、static_assert、nullptr和decltype。


16

Visual Studio 2010不支持初始化器列表。 在此处查看Visual Studio 2010支持的C++0x功能 (链接)

Visual Studio 2012也不支持它们。 您可以在此处找到Visual Studio 2012 / VS11中实现的C ++11功能 (链接)(链接)

初始化器列表的第一个实现可在Visual C ++ Compiler November 2012 CTP中找到 (链接)

初始化器列表的第一个真正版本将在Visual Studio 2013中发布。 (链接)


太遗憾了,VS2010不支持它。 - Dean Seo

3
即使它们在那里,这段代码也不会起作用,因为它将一个尚未成为向量的初始化列表分配给名为“tmp”的现有对象。您可以像这样对向量进行赋值:
vector<int> tmp = vector<int> {...}; // calls constructor, initializes then assigns

或者

std::initializer_list<int> iniList = {1,2,3,4,5,6};

但不包括

std::vector<int> tmp;
tmp = {...}; // calls assignment operator

顺便说一下:这个功能在VS2012中仍然缺失。

1
作为最新的更新,"tmp = {...}" 语法现在可以在 VS2013 和 g++ 4.7.1 中编译通过。 - Fernando Gonzalez Sanchez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接