rek*_*lmd 1 c++ designated-initializer c++20
我想了解指定初始化程序提供的与直接初始化不同的内容。
例如:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我们怎样才能把这两条线剥掉呢?对于细心的人,有什么区别?
在您发布的示例中,行为方面绝对没有区别。聚合被初始化为保存相同的三个值。在可读性方面,可以提出一个论点,即指定的初始化程序版本在发生的事情方面更加明确。它还可以用于文档目的。每个初始化程序的预期含义(假设我们为成员命名)都写在它旁边。
超越初始化中的显式。指定的初始值设定项也可以很好地与其他 C++ 功能配合使用。考虑一下。
struct Subject{
int x = 0;
int y = 0;
int z = 0;
};
Run Code Online (Sandbox Code Playgroud)
你可以写
Subject const s { .y = 2 };
Run Code Online (Sandbox Code Playgroud)
我们对除 之外的所有字段都使用默认值y。并且变量s是const,因为我们不希望它改变。这在常量正确性方面很好。
你可以在没有指定初始化器的情况下实现类似的效果,但是如果我们想要s保持常量,它会涉及更多的样板,并且可以说不会那么简洁明了。简而言之,这就是为什么他们很高兴在语言中使用。