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

为何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) }就成了多余的非法语法,因此报错。

正确写法有两种:

  1. 直接调用带初始化列表和比较器的构造函数,把两个参数一起传入:
set <A, Less> s2({ A(1), A(2) }, fnc);
  1. 先创建指定比较器的空set,再批量插入元素:
set <A, Less> s2(fnc);
s2.insert({ A(1), A(2) });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:10:17