为何C++委托构造函数不能搭配其他成员初始化器?
C++委托构造器的语法限制问题
原错误代码
class A{ private: int a; int b; int c; public: A(int a1){ a1 >= 0 ? a = a1 : a = -1; } A(int a1, int b1, int c1) : A{ a1 }, b{ b1 }, c{ c1 } {} // 此行报错 };
触发错误:A delegating constructor cannot have other mem-initializers
修改后的正确代码
class A{ private: int a; int b; int c; public: A(int a1){ a1 >= 0 ? a = a1 : a = -1; } A(int a1, int b1, int c1) : A{ a1 } { b = b1; c = c1; } };
原因解释
这是C++标准对委托构造器的明确规则:当一个构造器通过成员初始化列表委托调用另一个构造器时,它的初始化列表里绝对不能同时出现其他成员的初始化项。
原代码里的A{ a1 }, b{ b1 }, c{ c1 }直接违反了这条规则——既委托构造,又试图直接初始化b和c,所以编译器报错阻止这种写法。
修改后的代码把b和c的赋值移到了构造函数体内,这就规避了初始化列表的限制:委托构造器只负责调用目标构造器完成a的初始化,剩下的成员赋值逻辑在函数体里执行,完全符合C++的语法要求。
内容的提问来源于stack exchange,提问作者user21380625
相关产品推荐
相关产品推荐

