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

