c++17 聚合初始化

Posted

技术标签:

【中文标题】c++17 聚合初始化【英文标题】:c++17 Aggregate Initializations 【发布时间】:2017-07-01 14:52:56 【问题描述】:

我正在观看 Jason Tuner 在 youtube 上的视频系列,并在此特定视频中找到:Aggregate Initializations 他开始使用 clang++ c++03,然后将编译器更改为 clang++ c++11,然后当他合并基础他将类层次结构更改为使用 c++17 或 c++1z,使用最新版本的 clang++。

我最近刚刚下载并安装了 MSVS2017RC,我在 Intel Quad Core Extreme 上运行 Windows 7 64bit SP1。

但是,当我在 IDE 中尝试关注他的视频时

struct B 
    double q;
;

struct S : B 
    int i;
    float f;
;

int main() 
    S s , 1, 2.3f ;
    return s.f;

我收到此编译器错误:

1>------ Build started: Project: Test1z, Configuration: Debug Win32 ------
1>stdafx.cpp
1>Test1z.cpp
1>c:\users\skilz80\documents\visual studio 2017\projects\test1z\test1z\test1z.cpp(15): error C2440: 'initializing': cannot convert from 'initializer list' to 'S'
1>c:\users\skilz80\documents\visual studio 2017\projects\test1z\test1z\test1z.cpp(15): note: No constructor could take the source type, or constructor overload resolution was ambiguous
1>c:\users\skilz80\documents\visual studio 2017\projects\test1z\test1z\test1z.cpp(16): warning C4244: 'return': conversion from 'float' to 'int', possible loss of data
1>Done building project "Test1z.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Visual Studio 2017 是否支持 c++17 中的这些功能?如果是这样,是否需要在项目属性中设置特殊的编译器选项?或者这目前是 clang 或 gcc 独有的?如果这应该是 c++17 编译器,MS 的编译器错误 C2440 的主要原因是什么?

【问题讨论】:

【参考方案1】:

目前是 Visual Studio 2017 does not support all, or most, of C++17。它不支持基类的聚合初始化。

【讨论】:

好的,谢谢你的澄清。我确实在 MSDN 页面上看到它确实说聚合是可以的,但不是基类或继承,但 cppreference 网站确实显示了与上述视频系列中相似的语法支持。 @FrancisCugler:Cppreference 页面并没有说 VS2017 会这样做。事实上,它说的恰恰相反。在“使用基类聚合初始化类”下,Visual Studio 有一个很大的红色空间。 我想你误会了我;我并不是要明确地说 cppreference 是在声明它受 VS2017 支持。我只是说它是 c++17 的有效语法。同样在查看您提供的链接中的列表之后;看来 MS 开始落后了。 @FrancisCugler:开始?自 2011 年以来,VS 一直落后于 C++ 特性。VS2010 可能有几个 C++11 特性,但到 C++11 实际发布时,几乎所有其他编译器都有更多 C++11 特性。即使在 2011 年 6 年后,VS 仍然没有完全实现 C++11。 是的,我现在开始注意到这一点。自从我上中学时,我主要使用 Windows 版本 3.11 ...,然而,VS 的一个好处是他们的 IDE。遗憾的是,MS 没有实现标准或即将推出的标准中的所有内容,甚至可能拥有自己的“实验性”,超出标准,与开源社区或英特尔等其他专有软件不同,IBM或Apple(MAC)都在做。 ...

以上是关于c++17 聚合初始化的主要内容,如果未能解决你的问题,请参考以下文章

std::array 的嵌套聚合初始化

具有非静态成员初始化器的类的 C++11 聚合初始化

具有聚合初始化的 C++11 构造函数委托

C++ - 成员变量聚合初始化

[N ... M]在C聚合初始化器中的含义是什么?

使用 `` 在 C++ 中聚合初始化联合