为何set<A, Less>无法使用指定语法进行列表初始化?
问题解答
先看条款1能正常运行的原因:set<int> s1 = {1,2,3}; 属于拷贝初始化,编译器会自动调用set的初始化列表构造函数。因为set<int>默认用的比较器std::less<int>能默认构造,不需要显式传参,所以直接用初始化列表就能完成对象的创建和初始化。
再看条款2报错的原因:set<A, Less> s2(fnc) = { A(1), A(2) }; 试图同时混用两种初始化方式:先用括号(fnc)做直接初始化(指定比较器参数创建set对象),接着又用= {...}做拷贝初始化,这在C++语法里是不允许的。编译器会把set<A, Less> s2(fnc)当成完整的变量声明,后面的= { A(1), A(2) }就成了多余的非法语法,因此报错。
正确写法有两种:
- 直接调用带初始化列表和比较器的构造函数,把两个参数一起传入:
set <A, Less> s2({ A(1), A(2) }, fnc);
- 先创建指定比较器的空set,再批量插入元素:
set <A, Less> s2(fnc); s2.insert({ A(1), A(2) });
内容的提问来源于stack exchange,提问作者yapkm01
相关产品推荐
相关产品推荐

