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

C++中std::swap传入临时对象报C2665、E0304错误求助

问题根本原因

这个报错和库链接没有任何关系,属于编译阶段的函数重载匹配错误。
标准库中std::swap的基础重载原型为:

template< class T >
void swap( T& a, T& b ) noexcept(/* see description */);

可以看到它的两个入参都是非const左值引用,而C++语法规则明确禁止将临时对象(右值)绑定到非const左值引用上。
你报错的代码中,swap的第二个参数是unordered_map<int, vector<LidarPoint>>(),这是显式构造的临时对象,属于右值,不符合std::swap的参数要求,编译器找不到匹配的重载就会抛出参数不匹配的错误。
而你自己编写的代码里,第二个参数是有名字的变量allBeamPoints_new,属于可修改的左值,能正常绑定到左值引用,所以编译可以通过。

修复方案

如果你是想清空allBeamPoints的内容同时强制释放其占用的内存(普通clear()仅会删除元素,不会释放容器预留的内存空间),可以选择以下任意一种方式:

  • 沿用你自己的写法,先定义空的命名变量再做swap
  • 直接调用unordered_map的成员swap函数,成员函数支持接收临时对象作为入参:
    allBeamPoints.swap(unordered_map<int, vector<LidarPoint>>());
    
  • 如果你只需要清空元素不需要释放预留内存,直接调用allBeamPoints.clear()即可,语义更清晰。

关于库链接的疑问

你遇到的错误是编译期语法检查阶段的错误,还没有进入到程序的链接环节,完全不需要检查库链接情况,也和库依赖无关。

内容的提问来源于stack exchange,提问作者Haha more bug

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:45:06