当前位置: 首页 > 知识库问答 >
问题:

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

汤飞翮
2023-03-14

请考虑以下示例:

#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执行零初始化,就像对“没有构造函数的值初始化类类型的成员”一样。

如果它抛出,是编译器错误还是我遗漏了什么?

编辑:我在英特尔网站上提交了一个bug:https://community.intel.com/t5/intel-c-compiler/aggregate-initialization-bug-with-nested-struct/td-p/1178228

一位英特尔人士回答说:“我已经向我们的开发人员报告了这个问题。”可怜的开发人员,单枪匹马支持所有的icc开发。

共有1个答案

东门俊民
2023-03-14

首先:保证对象B.A.AB.A.BB.A.CB.A.D为零初始化。对于float,其初始化为=0;(不一定表示所有位为零)。

b b{};只在某些情况下转换为零初始化(cppreference页面有点误导)。

在C++14中:因为b是一个聚合,所以这是聚合初始化,每个成员都像通过一个空列表一样被初始化。因此,a a;被初始化为a{};A也是一个聚合,因此它的每个元素都像通过空列表一样被初始化,对于内置类型来说,这是零初始化。

在C++98中,规则是不同的,长话短说,b b={};将调用a的默认构造函数,这使得值未初始化。我们喜欢假装C++98初始化从来不存在,但一些编译器甚至在2010年代仍坚持这些规则。

因此,对于运算符是否保证零初始化的浮点数充当false,可能会有一些争论,请参见将浮点数与零进行比较。

标准规定“零值、空指针值或空成员指针值将转换为false”。这并不是100%精确,但是IMO零初始化的float应该为此被计算为“零值”。

 类似资料:
  • 问题内容: 我不知道如何初始化嵌套结构。在此处找到示例:http: //play.golang.org/p/NL6VXdHrjh 问题答案: 好吧,有什么特定的原因不使Proxy成为自己的结构? 无论如何,您有2个选择: 正确的方法是,只需将proxy移至其自己的结构,例如: 不太正确和丑陋的方法,但仍然有效:

  • 问题内容: 我有一个json作为 我想将我的结构编组到json之上并创建如下结构- 我在初始化上述结构时遇到麻烦。我不确定如何以以下方式初始化匿名结构: 我通过为页面信息创建一个单独的结构并将其与父结构附加在一起来解决此问题。但是,必须有某种方法来执行 匿名 嵌套结构的初始化,就像我对上面的 Fields (字符串切片)所做的一样。谁能将我重定向到一些指南来做到这一点? 问题答案: 这可行,但是很

  • 问题内容: 您如何初始化以下结构? 我试过了: 没用: 我试过了: 没用: 问题答案: 您是一个具有匿名结构类型的字段。因此,您必须重复类型定义: 但在大多数情况下,最好将其定义为rob74建议的单独类型。

  • 问题内容: 我怎样才能做到这一点: … 给出的编译结果为:“结构文字中的未知B字段’MemberA’” 当提供像这样的文字结构成员值时,如何初始化MemberA(从“父”结构)? 问题答案: 初始化时,匿名结构仅在其类型名称下(在您的情况下)是已知的。与该结构关联的成员和函数仅在实例存在之后才导出到外部。 您必须提供一个有效的实例来初始化: 编译错误 结构文字中的未知B字段’MemberA’ 确切

  • 问题内容: 嗨,我是Golang的新手,请帮助我。我已经在结构内部定义了一个结构。但是,当我尝试初始化主结构时出现错误。 我得到的错误是:不能在字段值中使用(类型接口{})作为类型结构:需要类型声明。 请提出一种初始化DetailsFilter的方法。我尝试执行在Golang中初始化嵌套结构中描述的方法,但即使这样也不起作用。 问题答案: 不幸的是,如果结构字段的类型是匿名结构,则 _在构造时_只

  • 主要内容:初始化内嵌匿名结构体结构体内嵌初始化时,将结构体内嵌的类型作为字段名像普通结构体一样进行初始化,详细实现过程请参考下面的代码。 车辆结构的组装和初始化: 代码说明如下: 第 6 行定义车轮结构。 第 11 行定义引擎结构。 第 17 行定义车结构,由车轮和引擎结构体嵌入。 第 27 行,将 Car 的 Wheel 字段使用 Wheel 结构体进行初始化。 第 32 行,将 Car 的 Engine 字段使用 Engi