- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我最近发现了 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/
我正在尝试在 Apache Camel 中实现以下路线:端点 1 接收消息。该路由向端点 2(清除正文)发起请求。 Transformer 使用端点 2 的结果来转换端点 1 传入消息的正文。 我尝试
我只需要对我的 Spring Web 应用程序的一个我不太理解的部分进行简短的解释。 我有一个带有 StudentController 的简单 mvc spring Web 应用程序。对于数据,我有一
我是一名优秀的程序员,十分优秀!