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

Posted

技术标签:

【中文标题】如何在 Visual Studio 中启用 C++0x 功能? [初始化列表支持]【英文标题】:How to enable C++0x features in Visual studio? [Initializer Lists support] 【发布时间】:2011-02-25 19:09:56 【问题描述】:

我有一些在 Ubuntu 上开发的代码,现在我正在尝试在 Windows 7(MS VS 2010)上编译它。

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

这给了我语法错误

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

这是因为 Visual Studio 不支持此功能吗?或者我应该在属性中启用一些开关。我将“平台工具集”属性设置为“v100”。

谢谢。

【问题讨论】:

有关当前编译器中 C++0x 支持的参考,请查看 Apache stdcxx 的页面:wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport - 只有 GCC 4.4+ 有初始化列表。 【参考方案1】:

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

编辑

根据这篇 MSDN 文章,初始化列表不是 2010 年支持的 6 个功能之一

http://msdn.microsoft.com/en-us/magazine/ee336130.aspx

Visual Studio 2010 中的 Visual C++ 编译器支持六种 C++0x 核心语言功能:lambda 表达式、auto 关键字、右值引用、static_assert、nullptr 和 decltype

【讨论】:

【参考方案2】:

Visual Studio 2010 不支持初始化列表。 查看 here 以了解 Visual Studio 2010 中支持的 C++0x 功能

Visual Studio 2012 也不支持它们。 您可以找到在 Visual Studio 2012 / VS11 here 和 here 中实现的 C++11 功能。

初始化列表的第一个实现在Visual C++ Compiler November 2012 CTP中可用。

initializer lists will be in Visual Studio 2013 的第一个真正版本。

【讨论】:

可惜VS2010不支持。【参考方案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 中仍然缺少该功能。

【讨论】:

作为更新,语法“tmp = ...”现在可以在 VS2013 & g++ 4.7.1 中编译。

以上是关于如何在 Visual Studio 中启用 C++0x 功能? [初始化列表支持]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 2015 隔离外壳中启用PrivateGalleries

如何在 Visual Studio 2017 中启用 WiX 项目

如何在 Visual Studio 2017 中启用 TFS 跟踪

如何在 Visual Studio 中启用 NuGet 包还原?

如何在 Visual Studio 中(重新)启用实时 CSS 编辑?

如何在 Visual Studio 2019 中启用编译器警告?