【发布时间】:2014-01-12 02:13:40
【问题描述】:
我正在尝试使用https://stackoverflow.com/a/709161/837451 中的示例通过交换清除 std::queue。但是,由于“已删除函数”错误,它似乎不适用于 lambda 比较器。
最小的工作失败示例:
#include <queue>
#include <vector>
using namespace std;
int main(){
typedef pair<int,float> ifpair;
auto comp = []( ifpair a, ifpair b ) { return a.second > b.second; };
typedef priority_queue< ifpair , vector<ifpair>, decltype( comp ) > t_npq;
t_npq npq( comp );
//do something with npq. finish using it (without emptying it) and clear for next round
t_npq empty( comp );
swap(npq , empty);
}
编译
g++ -std=c++11 /tmp/test.cpp -o /tmp/o
我收到以下错误:
/usr/include/c++/4.8/bits/move.h:176:11: error: use of deleted function ‘main()::__lambda0& main()::__lambda0::operator=(const main()::__lambda0&)’
__a = _GLIBCXX_MOVE(__b);
^
/tmp/test.cpp:6:18: note: a lambda closure type has a deleted copy assignment operator
g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.8.1-10ubuntu9' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu9)
我有点好奇这里到底发生了什么,但更重要的是我真的很想知道如何使这项工作发挥作用。
【问题讨论】:
-
在我的机器上工作!您使用的是什么编译器(和版本)?标准库实现的同上。
-
次优快速修复:使用
std::function<bool(ifpair,ifpair)> -
你真的希望
comp的值通过值而不是通过 ref 或 const ref 传递吗? -
@woolstar:可能是的。这些是非常小的值,复制起来很便宜。
-
除了我之前的评论:甚至
bool(*)(ifpair,ifpair);这应该可以工作并且不会增加std::function的开销
标签: c++ c++11 stl lambda deleted-functions