C++构造函数的成员初始化列表中是否可以使用结构化绑定?
解答
你提到的写法不符合C++语法规则,结构化绑定不支持在构造函数的成员初始化列表中使用。结构化绑定的作用是声明新的变量,而成员初始化列表是对类中已经声明过的成员进行初始化,二者的语义完全不匹配,并非你拼写的语法存在错误。
以下是几种更简洁的替代实现方案:
- 方案一:内置私有数据结构体
将需要初始化的const成员打包为一个私有内部结构体,直接初始化该结构体后通过getter对外暴露数值,不会产生额外的性能损耗:
class Class { struct InternalData { int foo, bar; InternalData(int baz, int qux) { initializerFunction(&foo, baz, &bar, qux); } } const data; public: Class(int baz, int qux) : data(baz, qux) {} int get_foo() const { return data.foo; } int get_bar() const { return data.bar; } };
- 方案二:静态辅助函数(不推荐高性能场景)
如果不想新增getter,可以通过静态辅助函数返回中间结构体,再在初始化列表中分别取成员赋值,缺点是会生成两次中间结构体实例:
class Class { const int foo, bar; static Struct init_temp(int baz, int qux) { return Struct{baz, qux}; } public: Class(int baz, int qux) : foo(init_temp(baz, qux).foo), bar(init_temp(baz, qux).bar) {} };
- 方案三:保留原委托构造逻辑
你原本使用的委托构造写法是C标准支持的合法写法,可读性和性能都没有明显缺陷,在无法使用高版本C特性的场景下是非常成熟的实现方案。
内容的提问来源于stack exchange,提问作者QuaternionsRock
相关产品推荐
相关产品推荐

