在 Visual C++ 编译器中使用 std::initializer_list 2012 年 11 月 CTP

Posted

技术标签:

【中文标题】在 Visual C++ 编译器中使用 std::initializer_list 2012 年 11 月 CTP【英文标题】:Use std::initializer_list in Visual C++ Compiler November 2012 CTP 【发布时间】:2013-01-11 15:46:29 【问题描述】:

我想在 Visual Studio 2012 中使用 std::initializer_lists,就像在 this example 中的人一样。我的操作系统是 Windows 8 x64。

因此,我最近安装了Visual C++ Compiler November 2012 CTP,正如微软所说,我更改了项目的平台工具集以使用新的更新编译器。

但即使这样做了,也没有std::initializer_list<initializer_list> 标头可用。但是微软的链接网站告诉我(在标题“概述”下)初始化列表将随该更新提供。我重新启动了 IDE 和我的 PC。我不确定这是否可能是由于我(遗憾地)使用德文版的 Visual Studio 并且编译器更新是英文的。我做错了什么?

更新:尝试编译被 IntelliSense 批评的行auto a = 0 ;,编译器输出显示'Microsoft Visual C++ Compiler Nov 2012 CTP' is for testing purposes only.,然后编译器崩溃并出现一个错误窗口,显示为Microsoft (R) C/C++ Compiler Driver has stopped working。没有任何新的语法,所有的东西都可以编译并在选择的新编译器下正常工作。

【问题讨论】:

【参考方案1】:

(我在 Microsoft 工作并与 Dinkumware 一起维护 VC 的标准库实现。)

[danijar]

我不确定这是否是由于我(遗憾地)使用的是德语版的 Visual Studio 并且编译器更新是英文的。

很遗憾,英文版 CTP 不支持德文 VS。

“编译器驱动程序”cl.exe 是调用编译器前端 c1xx.dll、编译器后端 c2.dll 和链接器 link.exe 的程序。编译器驱动程序崩溃是非常不寻常的。我推测它试图显示 CTP 添加的错误消息之一,但由于 CTP 没有更新德语资源,编译器驱动程序无法加载错误消息并继续崩溃。

请注意,这不同于前端或后端中的内部编译器错误,或者碰巧错误发出的正常编译器错误。 (CTP 发布后,许多 ICE 和虚假错误已得到修复。)

但即使这样做了,也没有可用的 std::initializer_list 和 标头。

CTP 将 安装在一个特殊位置。 (其实是编译组写的)

在命令行上,使用 CTP 并将 放在包含路径上的咒语是(假设默认位置):

"C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat" x86
set PATH=C:\Program Files (x86)\Microsoft Visual C++ Compiler Nov 2012 CTP\bin;%PATH%
set INCLUDE=C:\Program Files (x86)\Microsoft Visual C++ Compiler Nov 2012 CTP\include;%INCLUDE%

试图编译行 auto a = 0 ;被 IntelliSense 批评

这已记录在案 - CTP 未更新 Intellisense,因此它不会识别任何新功能。

[rubenvb]

C++ 标准库没有用编译器更新,让你没有像样的 (这包括所有标准容器的括号初始化列表构造函数的省略)

您可能有兴趣了解我们已更新标准库以完全支持范围枚举和初始化列表。这包括当前工作文件 (N3485) 规定的所有 initializer_list 重载,以及在通常位置安装 以及所有其他标准头文件。 (它也是 Dinkumware 的官方副本,尽管它与编译器团队的“假”版本之间的差异主要是装饰性的。)这些东西将在下一个公开版本中提供,无论何时何地。我们的下一个任务是使用显式转换运算符和可变参数模板更新标准库,替换我们脆弱的模拟。

【讨论】:

由于 MSVS2012 有两次更新,我想知道 11 月 CTP 编译器更新的结果如何。如果您已经实施了 STL 修改,为什么它们还没有发布给我们?【参考方案2】:

您已经注意到,11 月 CTP 的可用性非常有限,至少有两个原因:

    编译器有许多导致崩溃的错误,例如您发现的错误。

    C++ 标准库没有用编译器更新,让您没有像样的<tuple><intializer_list>(这包括省略所有标准容器的花括号初始化列表构造函数)

另外:链接的例子是非常丑陋的代码。如果您想使用此功能,请使用支持此语法的编译器,如 GCC 或 Clang。它们都可用于 Windows。通过编写额外的代码来破解半实现的语言功能是愚蠢的。

【讨论】:

以上是关于在 Visual C++ 编译器中使用 std::initializer_list 2012 年 11 月 CTP的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Visual C++ 中的 SFINAE constexpr 错误

Visual Studio中的c ++编译器标志

获取 Visual Studio 使用的 C++ 标准版本

std::thread,在线程中抛出异常会导致 Visual C++ 中的中止错误

如何在 Visual Studio 2008 和 C++ 中显示希腊字符? [复制]

我可以在 Visual Studio 2008 中使用 Visual Studio 6 编译的 C++ 静态库吗?