下面结构体初始化语句是合法的。
struct Point {
int x;
int y;
};
Point p{3, 4};看到结构体初始化先想语法:C++11起支持聚合初始化,大括号内按成员顺序赋值。本题结构体有两个int成员,初始化列表{3,4}正好对应x和y,类型匹配、顺序正确,所以合法。这类题通法是:先确认语法是否允许(有无构造函数),再看成员数量和类型是否一一对应,最后检查值是否合法。
易错点在于混淆括号初始化与大括号初始化:C++11后聚合类型支持大括号初始化,括号初始化仅用于构造函数参数。本题结构体无构造函数,但大括号初始化完全合法。另一个陷阱是误以为成员顺序可以随意打乱,其实必须按声明顺序对应。
GESP 四级 C++ 大纲中,结构体属于"基本数据类型与结构体"模块,初始化语法是必考内容。命题人放这道题,就是卡住那些死记"括号初始化"的考生——他们看到大括号就条件反射觉得错,完全没理解 C++11 后聚合类型的新规则。
看到 Point p{3,4} 先判断结构体定义:无构造函数、无私有成员、无虚函数,是聚合类型,允许大括号初始化。成员顺序是 x 在前 y 在后,初始化列表两个 int 值正好对应。类型检查:3 和 4 都是 int 可表示范围。结论:合法。
选项 B 的错误设计很典型:利用考生对"初始化"概念的狭隘理解,把大括号当成"赋值语句"而非"初始化语法"。命题人还埋了个语义陷阱——如果结构体加了构造函数,这行代码就非法了,但本题故意没加,就是要测试你是否真正理解"聚合类型"的定义。
若把结构体加上构造函数 Point(int,int){},大括号初始化就非法,只能改用构造函数调用 Point p(3,4)。若把成员改成 char 类型,{3,4} 就会因为值超出范围而报错。反过来,若改成 Point p = {3,4}; 也是合法的,因为赋值初始化同样支持聚合语法。命题人想考的就是这种"条件变化导致合法性变化"的敏感度。