【问题标题】:Implicit initialization of aggregate subpbject聚合子对象的隐式初始化
【发布时间】:2020-02-03 11:03:15
【问题描述】:

在查看 N2310 中聚合的初始化规则时,我发现以下段落(emp. mine):

6.7.9(p19):

初始化应按初始化列表顺序进行,每个 为覆盖任何特定子对象提供的初始化程序 先前列出的相同子对象的初始化程序; 154) 全部 应初始化未显式初始化的子对象 与具有静态存储持续时间的对象隐式相同。

6.7.9(p21):

如果大括号括起来的列表中的初始值设定项比那里少 是聚合的元素或成员,或 用于初始化已知大小的数组的字符串文字 是数组中的元素,聚合的其余部分应为 隐式初始化与具有静态存储的对象相同 持续时间

在我看来,6.7.9(p19) 暗示了6.7.9(p21)(但反之亦然)。例如:

#include <stdio.h>

struct test{
    int a;
    int b;
    int c;
};

int main(){
    struct test test = {
        .a = 123
    };

    printf("%d%d%d\n", test.a, test.b, test.c); //obviously, 12300 is printed
}

我觉得这个案例6.7.9(p19)6.7.9(p21)都可以解释

6.7.9(p21) 的目的是什么?我错过了什么?

【问题讨论】:

    标签: c struct initialization aggregate language-lawyer


    【解决方案1】:

    6.7.9 考虑到了所谓的指定初始化器。

    考虑以下演示程序

    #include <stdio.h>
    
    struct test{
        int a;
        int b;
        int c;
    };
    
    int main(void) 
    {
        struct test test = {
            .c = 123
        };
    
        printf("%d %d %d\n", test.a, test.b, test.c);
    
        return 0;
    }
    

    它的输出是

    0 0 123
    

    或其他程序

    #include <stdio.h>
    
    int main(void) 
    {
        enum { N = 10 };
        int a[N] = { [0] = 0, [4] = 4, [9] = 9 };
    
        for ( size_t i = 0; i < N; i++ ) printf( "%d ", a[i] );
        putchar( '\n' );
    
        return 0;
    }
    

    它的输出是

    0 0 0 0 4 0 0 0 0 9
    

    所以

    所有未显式初始化的子对象都应 隐式初始化与具有静态存储的对象相同 持续时间

    第二个引用在 C 标准中采用指定的初始化器之前就已经存在,并描述了例如这样的情况

    char s[20] = "Hello";
    

    并回答字符数组的尾部是否会被初始化的问题。它保持与 C++ 标准的兼容性,在 C++ 17 标准之前,指定初始化器不存在。

    【讨论】:

    • "在 C++ 17 标准之前,指定的初始化器是不存在的。"打算用 C++20 代替 C++17 吗?
    • @L.F.它们在 C++ 17 标准草案中有所描述。
    • 如果我理解正确,关键是第二个引用不关心initializer-list,但第一个是。对吗?
    • @SomeName 否,两个引号都处理初始化列表。但是第一个引用描述了聚合的元素在两个或一个指定的初始值设定项之前没有显式初始值设定项的情况。第二个引用描述了初始化数据成员之间没有间隙但没有足够的初始化器用于所有元素的情况。
    • @SomeName 在这种情况下,两个引号都适用。
    猜你喜欢
    • 2019-07-30
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    相关资源
    最近更新 更多