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
相关产品推荐
相关产品推荐

