【发布时间】:2016-04-02 03:15:37
【问题描述】:
我最近发现了 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++14 模式下编译?
-
是的,我愿意。我还启用了所有警告
-Wall,但没有收到任何警告。 -
在 C++11 中,一个带有 non-static in-class member initializers is not an aggregate 的类,所以这在 C++11 模式下会失败,但在 C++14 模式下应该都能成功。正如我在answer 中提到的链接问题 gcc 直到 5.0 才支持这一点。
-
@melak47 见我上面的注释