考虑此示例:
#include <vector>
#include <stdexcept>
struct A
{
float a;
float b;
float c;
float d;
};
struct B
{
A a;
std::vector<int> b;
};
int main() {
B b{};
if (b.a.a || b.a.b || b.a.c || b.a.d) throw std::runtime_error("Compiler bug?");
}
如果我正确理解,根据https://en.cppreference.com/w/cpp/language/zero_initialization,它不会抛出异常,因为应该对B :: a进行零初始化,就像对“没有构造函数的值初始化类类型的成员”一样。
如果抛出,是编译器错误还是我缺少什么?
[编辑]
这里启用了clang 10,并启用了优化,它只会执行“ mov eax,2”和“ ret”(表示条件为假):https://godbolt.org/z/CXrc3G
但是如果我删除括号,它将执行“ mov eax,1”和“ ret”(表示条件为真)。但是在这里,我认为它可以返回任何所需内容,因为它只是UB。https://godbolt.org/z/tBvLzZ
因此似乎clang认为必须使用大括号零初始化才能执行。
首先:确保对象b.a.a
,b.a.b
,b.a.c
,b.a.d
被初始化为零。 float
的哪个好像由= 0;
初始化(不一定表示所有位为零)。