例子:
#include <functional>
int main() {
auto test = []{};
test = []{};
return 0;
}
这会在 gcc 4.7.2 中发出以下错误消息:
test.cpp: In function ‘int main()’:
test.cpp:5:13: error: no match for ‘operator=’ in ‘test = <lambda closure object>main()::<lambda()>{}’
test.cpp:5:13: note: candidate is:
test.cpp:4:16: note: main()::<lambda()>& main()::<lambda()>::operator=(const main()::<lambda()>&) <deleted>
test.cpp:4:16: note: no known conversion for argument 1 from ‘main()::<lambda()>’ to ‘const main()::<lambda()>&’
从标准 5.1.2.3(强调我的):
一个实现可以定义不同于下面描述的闭包类型,前提是这不会改变程序的可观察行为,除非改变:
— 闭包类型的大小和/或对齐方式,
— 闭包类型是否可简单复制(第 9 条)
— 闭包类型是否是标准布局类(第 9 条),或者
— 闭包类型是否是 POD 类(第 9 条)。
据我所知,这就是我要面对的。它试图使用已删除的赋值运算符并失败。我很想知道是否有一个简单的解决方法,以及更广泛地说,允许对 lambdas 省略复制可构造性的动机是什么。