嵌套结构的零初始化-编译器错误?

问题描述 投票:4回答:1

考虑此示例:

#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认为必须使用大括号零初始化才能执行。

c++ c++14
1个回答
5
投票

首先:确保对象b.a.ab.a.bb.a.cb.a.d被初始化为零。 float的哪个好像由= 0;初始化(不一定表示所有位为零)。

© www.soinside.com 2019 - 2024. All rights reserved.