gpt4 book ai didi

c++ - 为什么 clang 和 gcc 以不同的方式处理具有类内初始化的结构的支撑初始化?

转载 作者:可可西里 更新时间:2023-11-01 18:28:01 25 4
gpt4 key购买 nike

我最近发现了 clang 和 gcc 的一个奇怪行为。我有一个结构 (MyClass),它对其其中一个成员 (active) 使用类内初始化:

struct MyClass {
int something;
bool active = true;
};

现在我尝试用大括号初始化这个类。

使用 clang,我可以决定是否在初始化列表中包含 active (MyClass a = { 42, true};) 或不包含 (MyClass a = { 42 };).

但是使用 gcc,我的代码只有在不包含 active 时才能编译。否则,我将得到以下编译器错误:

 error: could not convert ‘{42, true}’ from ‘<brace-enclosed initializer list>’ to ‘MyClass’

这是一个错误吗?标准对此有何规定? VSC++呢?您会推荐哪种方式作为可移植解决方案?

在 Debian Linux 上使用 gcc 4.9 和 clang 3.5 测试。

最佳答案

此代码的行为在 C++11 和 C++14 之间发生了变化。

在 C++11 中,= true 的存在意味着该类不是聚合。因此,您不能使用聚合初始化。

在 C++14 中,类仍然是聚合,因此您可以再次使用聚合初始化。

编译器之间的差异可以用一个比另一个更新来解释。使用compiler explorer我看到 gcc 4.9.x 弄错了,但这在 gcc 5.1 中得到了修复。

关于c++ - 为什么 clang 和 gcc 以不同的方式处理具有类内初始化的结构的支撑初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34490692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com