为何std::set可接受{}作为参数,而boost::container::flat_set却不可?
原因分析
核心问题在于C++11列表初始化的支持差异:
std::set在C++11标准中就提供了接受std::initializer_list<T>的构造函数,因此{}可以被隐式转换为临时的std::set对象,再绑定到const SET&参数上,所以show({})可以正常编译。- 但Boost 1.60.0版本的
boost::container::flat_set并未实现std::initializer_list构造函数,无法通过{}直接隐式构造出flat_set实例。编译器找不到匹配的函数重载,因此报错。而SET()是显式构造一个默认初始化的flat_set临时对象,能被const SET&参数绑定,所以可以编译通过。
简便处理方式
1. 升级Boost版本
Boost 1.62及后续版本的boost::container::flat_set已经添加了对std::initializer_list的支持,升级后无需修改任何调用代码,show({})就能像使用std::set时一样正常编译运行,这是最省心的解决方案。
2. 添加重载函数适配初始化列表
如果无法升级Boost,可以给目标方法添加一个接受std::initializer_list的重载,间接构造flat_set:
static void show(std::initializer_list<MAP> init) { show(SET(init.begin(), init.end())); }
这样所有原有show({})的调用都无需修改,编译器会自动匹配这个重载,再转发到原函数。
3. 批量替换显式构造(备选方案)
如果代码范围不大,可以用批量替换工具把所有show({})替换为show(SET()),但这种方式需要修改所有调用点,不如前两种方案高效。
内容的提问来源于stack exchange,提问作者Frank Puck
相关产品推荐
相关产品推荐

