是否可以在c++中初始化结构,如下所示:
struct address {
int street_no;
char *street_name;
char *city;
char *prov;
char *postal_code;
};
address temp_address = { .city = "Hamilton", .prov = "Ontario" };
这里和这里的链接提到,这种样式只能在C中使用。如果是这样,为什么在c++中不能使用呢?是否有任何潜在的技术原因,为什么它不是在c++中实现的,或者使用这种风格是不好的做法。我喜欢使用这种初始化方式,因为我的结构体很大,而且这种样式可以让我清楚地了解分配给哪个成员的值。
请与我分享是否有其他方法可以达到同样的可读性。
在提出这个问题之前,我已参考以下连结:
C/ c++ for AIX
C结构初始化变量
c++中使用标记的静态结构初始化
c++ 11正确的结构初始化
这个特性称为指定初始化式。它是C99标准的补充。然而,这个特性在c++ 11中被忽略了。根据c++编程语言,第4版,第44.3.3.2节(c++未采用的C特性):
c++故意没有采用C99的一些附加功能(与C89相比):
[1]变长数组(VLAs);使用矢量或某种形式的动态数组
[2]指定初始化式;使用构造函数
C99语法有指定的初始化式[参见ISO/IEC 9899:2011, N1570委员会草案- 2011年4月12日]
6.7.9初始化
initializer:
assignment-expression
{ initializer-list }
{ initializer-list , }
initializer-list:
designation_opt initializer
initializer-list , designationopt initializer
designation:
designator-list =
designator-list:
designator
designator-list designator
designator:
[ constant-expression ]
. identifier
另一方面,c++ 11没有指定的初始化式[参见ISO/IEC 14882:2011, N3690委员会草案- 2013年5月15日]
8.5初始化
initializer:
brace-or-equal-initializer
( expression-list )
brace-or-equal-initializer:
= initializer-clause
braced-init-list
initializer-clause:
assignment-expression
braced-init-list
initializer-list:
initializer-clause ...opt
initializer-list , initializer-clause ...opt
braced-init-list:
{ initializer-list ,opt }
{ }
为了达到同样的效果,可以使用构造函数或初始化列表: