返回带有未初始化成员的内联定义结构。 C ++

时间:2019-02-27 15:07:16

标签: c++ struct c++17

这个问题在论坛上很少受到关注。

之前曾有人问过,但没有人捕捉到这个小细节。结果,我不确定自己是否做对了:

简单示例

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://the.url.com');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, [
         'file' => curl_file_create($file),
         'list_item' => [
             'foo',
             'bar'
         ]
    ]);
    $response = curl_exec($ch);

这是正确的吗?请注意,int值未初始化。 虽然将其设置为0不会有问题,但会出现更多问题:

struct TEST {
    bool a;
    int b;
};

TEST func() {
    return { false };
}

从向量,数组到函数指针,结构的最后一个成员可能会变得越来越复杂。

返回内联初始化的结构时,可以将某些成员留空吗?

1 个答案:

答案 0 :(得分:9)

这称为聚合初始化。

https://en.cppreference.com/w/cpp/language/aggregate_initialization

  

如果初始化程序子句的数量少于成员和基数(从C ++ 17开始) 或初始化程序列表完全为空,则其余成员和基数(从C开始++ 17)由其默认成员初始化程序(如果在类定义中提供了)初始化,否则(自C ++ 14起)由空列表初始化(根据通常的列表-初始化规则(使用默认构造函数对非类类型和非聚合类执行值初始化,以及对聚合进行聚合初始化)。如果引用类型的成员是这些其余成员之一,则程序格式错误。

因此,在聚合初始化中,您允许提供的子句少于结构体中的成员。其余所有没有默认初始化程序的成员(例如X)将被初始化为X {}。