gpt4 book ai didi

c++ - 空括号在结构声明中意味着什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:17 34 4
gpt4 key购买 nike

这里是 struct 的缩减定义,只显示了问题所在。

struct Entry {
// bookkeeping record for managing solution search
std::array<std::array<bool, DIM>, DIM> filled; // which holes have been filled
std::array<std::array<char, MAX>, MAX> cells; // individual cell entries, 0=empty
std::vector<Constraint> overlaps;
std::vector<Hole*>::iterator candidates;
Entry() = default;
};

这实际上是一个错误。我在想默认构造函数会对数组进行零初始化,但它只是用随机垃圾填充它们。我现在知道我需要编写默认构造函数,但我对测试时遇到的行为感到困惑。

这是我的测试函数的精简版:

void testEntry(void) {
Entry e;
std::cout << std::boolalpha;
e.cells[1][2] = 'a';
e.filled[0][0] = true;
for (int i = 0; i < MAX; ++i)
for (int j = 0; j < MAX; ++j)
std::cout<<i<<" "<<j<<" "<<e.cells[i][j]<<std::endl;
for (int i = 0; i < DIM; ++i)
for (int j = 0; j < DIM; ++j)
std::cout<<i<<" "<<j<<" "<<e.filled[i][j]<<std::endl;
}

当我运行它时,filledcells 数组包含随机垃圾,最终我发现了我的错误。在调试时,我将声明 Entry e; 更改为 Entry e{}; 并且修改后的代码似乎按预期工作,但我不明白为什么。

我不是很了解文档。在 list initialization 下它说,“如果 braced-init-list 为空并且 T 是具有默认构造函数的类类型,则执行值初始化。”这很清楚,但是当我转到 value initialization 时,我无法弄清楚哪些情况适用(如果有的话)。似乎是 zero-intialization 下的这个条款正在申请“如果 T 是非 union 类类型,则所有基类和非静态数据成员都被零初始化,并且所有填充都被初始化为零位。构造函数(如果有的话)将被忽略,”但我没有看到如何到达这里。

最重要的是,我想知道规范中是否真的定义了这种行为,或者它是否可能因不同的编译器而有所不同。 (我在 Xcode 7.2.1 下使用 clang)。

最佳答案

What do empty brackets mean in struct declaration?

T object {};value initialization (4) 的语法.如果没有大括号,对象将是 default initialized .

迂腐地说,这不是“结构声明”。它是一个变量的声明。

when I go to value initialization, I can't figure out which, if any, of the cases apply.

这个适用:

2) if T is a class type with a default constructor that is neither user-provided nor deleted (that is, it may be a class with an implicitly-defined or defaulted default constructor), the object is zero-initialized and then it is default-initialized if it has a non-trivial default constructor; (since C++11)

这就是我们实现零初始化的方式。您对零初始化规则的解释是正确的。

I'm wondering if this behavior is actually defined in the specs

链接页面中的规则基于标准,而不是特定的实现。行为已定义。

关于c++ - 空括号在结构声明中意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39429510/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com