【发布时间】:2014-10-08 11:47:06
【问题描述】:
如果我有一个常见的 linux 结构,例如:
struct sockaddr_in
{
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
unsigned char __pad[__SOCK_SIZE__ - sizeof(short int)
- sizeof(unsigned short int) - sizeof(struct in_addr)];
};
#define sin_zero __pad
然后我执行聚合初始化:
struct sockaddr_in my_addr = { 0 };
为什么这会将每个成员都初始化为 0?
我的意思是:文档说:
如果初始化子句的数量小于 成员或初始化子句完全为空,其余的 成员由它们的大括号或等号初始化器初始化,如果 在类定义中提供,否则 (C++14 起) 为空 列表,它执行值初始化。
为了简单起见:为什么这段代码会打印 0?
struct sockaddr_in my_addr = {2, 2}; // initialize sin_family and sin_port to 2, everything else value-initialized
my_addr = {0};
std::cout << my_addr.sin_port; // Why is this 0?
【问题讨论】:
-
{0}使用该初始化程序创建一个临时的sockaddr_in,然后=复制整个临时文件。 -
如果初始化器的数量少于要初始化的成员,其余成员将被初始化为
static(即使用 0)。 -
@TheParamagneticCroissant,C 就是这种情况,但对于 C++,并非所有类型都可以用 0 初始化。它们是值初始化的,这可能会将它们设置为零,但默认构造函数可以做一些不同的事情.
-
@T.C.没有为聚合初始化或 C++11 列表初始化创建临时文件,即使它在语法上是 复制初始化。参见 [dcl.init] p17,项目符号 17.6.2。相反,
my_addr的成员直接从列表元素复制初始化 -
@T.C.啊,我以为您指的是问题前面的
struct sockaddr_in my_addr = { 0 };sn-p。我应该注意到你说的是{0}而不是{ 0 }:-)
标签: c++ initialization list-initialization