1

我希望了解指定初始化程序提供的与直接初始化不同的内容。

例如:

#include <iostream>

struct Subject{

    int x;
    int y;
    int z;

};

int main()
{ 
    Subject subject_d{.x = 1, .y = 2, .z= 3};
    Subject subject_c{1, 2, 3};

    return 0;
}

我们如何去装饰这两条线?对于细心的,有什么区别?

4

3 回答 3

5

在您发布的示例中,行为方面绝对没有区别。聚合被初始化以保存相同的三个值。就可读性而言,可以提出一个论点,即指定的初始化程序版本在发生的事情方面更加明确。它也可以用于服务于文档目的。每个初始化器的预期含义(假设我们很好地命名了成员)都写在它旁边。

超出初始化的显式性。指定的初始化器也可以很好地与其他 C++ 特性配合使用。改为考虑。

struct Subject{
    int x = 0;
    int y = 0;
    int z = 0;
};

你可以写

Subject const s { .y = 2 };

我们使用除 之外的所有字段的默认值y。并且变量s是 const,因为我们不希望它改变。就 const 正确性而言,这很好。

您可以在没有指定初始化程序的情况下实现类似的效果,但如果我们想保持 const,它将涉及更多样板s,并且可以说不会那么简洁明了。简而言之,为什么它们很适合使用该语言。

于 2020-07-13T13:46:21.820 回答
2

那行:

Subject subject_d{.x = 1, .y = 2, .z= 3};

如果您重命名至少一个字段或更改它们的顺序,它将不再编译,因此该表单是“安全的”

Subject subject_c{1, 2, 3};

不假设字段的名称,因此如果您交换它们的顺序,每个字段的初始化将不一样,而是静默

于 2020-07-13T13:37:11.030 回答
1

这两行在语义上是等价的。两者之一更明确,可以减少软件错误。

于 2020-07-13T13:32:40.163 回答