结构声明中空括号的含义是什么?

sau*_*atz 5 c++ c++11

这是a的简要定义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;
};
Run Code Online (Sandbox Code Playgroud)

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

这是我的测试功能的简化版本:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

我不太能够遵循文档.在列表初始化下,它表示"如果braced-init-list为空且T是具有默认构造函数的类类型,则执行值初始化." 这很清楚,但是当我进行值初始化时,我无法确定哪些情况(如果有的话)适用.似乎正在应用零 - 初始化下的此子句"如果T是非联合类类型,则所有基类和非静态数据成员都是零初始化的,并且所有填充都初始化为零位.构造函数,如果任何,被忽略,"但我不知道如何到达这里.

最重要的是,我想知道这个行为是否实际在规范中定义,或者它是否与不同的编译器不同.(我在Xcode 7.2.1下使用clang).

eer*_*ika 7

空括号在结构声明中的含义是什么?

T object {};值初始化的语法(4).如果没有大括号,则对象将默认初始化.

要迂腐,这不是"结构宣言".它是变量的声明.

当我进行值初始化时,我无法弄清楚哪些情况(如果有的话)适用.

这个适用:

2)如果T是具有默认构造函数的类类型,该构造函数既不是用户提供也不是删除(也就是说,它可能是具有隐式定义或默认默认构造函数的类),该对象是零初始化的,然后它是default-initialized如果它有一个非平凡的默认构造函数; (自C++ 11以来)

这就是我们如何实现零初始化.您对零初始化规则的解释是正确的.

我想知道这种行为是否实际上是在规范中定义的

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