You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++11中存在std::initializer_list构造函数时,如何使用默认成员初始化器?

更优解决方案汇总

当类同时存在std::initializer_list构造函数和普通多参数构造函数时,类内成员初始化会遇到{}优先匹配初始化列表、()被误解析为函数声明的问题,以下是几种比A a{A(1, 2)};更优雅的解决方式:

1. 拷贝初始化语法

直接通过等号+构造表达式初始化成员,编译器会优化掉临时对象的拷贝操作,直接调用目标构造函数:

struct B {
    A a = A(1, 2); // 明确调用A::A(int, int)
};

2. 构造函数初始化列表

给结构体添加构造函数,在初始化列表中用圆括号指定构造方式,完全规避初始化列表构造函数的干扰:

struct B {
    A a;
    B() : a(1, 2) {} // 调用双参数构造函数
};

这种方式更适合需要根据构造参数动态初始化成员的场景。

3. 括号包裹参数的初始化技巧

通过给单个参数添加括号,让编译器将其解析为表达式而非初始化列表元素,从而匹配双参数构造函数:

struct B {
    A a{ (1), (2) }; // 调用A::A(int, int)
};

以上方案均比A a{A(1, 2)};更简洁易读,可根据实际场景选择使用。

内容的提问来源于stack exchange,提问作者xmllmx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 10:07:43