在C中初始化结构

作为this question的附录,这里是怎么回事:

#include <string>
using namespace std;

struct A {
    string s;
};

int main() {
    A a = {0};
}

显然,你不能将std :: string设置为零。有人可以提供一个解释(支持参考C标准,请)关于实际应该发生在这里?然后解释一下):

int main() {
    A a = {42};
}

这两个是否都很好定义?

对我来说再次是一个令人尴尬的问题 – 我总是给我的structs构造函数,所以问题从来没有出现过。

你的struct是一个聚合,所以聚合初始化的普通规则为它工作。该过程在8.5.1中描述。基本上整个8.5.1是专门为它,所以我没有看到原因复制这里的整个东西。一般的想法是几乎一样的C,只是适应C:你从右边的初始化,你从左边取一个成员,你用初始化器初始化成员。根据8.5 / 12,这将是一个复制初始化。

当你这样做

A a = { 0 };

你基本上是用0来初始化a.s,即对于a.s它在语义上等同于

string s = 0;

上面的编译是因为std :: string可以从const char *指针转换。 (并且它是未定义的行为,因为在这种情况下,空指针不是有效的参数。)

你的42版本不会编译为同样的原因

string s = 42;

将无法编译。 42不是空指针常量,std :: string没有从int类型转换的方法。

P.S。在情况下:注意C中的聚合的定义不是递归的(例如,与POD的定义相反)。 std :: string不是一个聚合,但它不会改变任何你的A. A仍然是一个聚合。

http://stackoverflow.com/questions/2838107/initializing-structs-in-c

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:在C中初始化结构