【问题标题】:How to enable C++0x features in Visual studio? [Initializer Lists support]如何在 Visual Studio 中启用 C++0x 功能? [初始化列表支持]
【发布时间】: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”。

谢谢。

【问题讨论】:

标签: visual-studio-2010 c++11


【解决方案1】:

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

编辑

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

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 herehere 中实现的 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 中编译。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 2015-01-21
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多