【发布时间】:2013-09-16 08:08:42
【问题描述】:
例子:
#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 通常省略复制可构造性的动机是什么。
【问题讨论】:
-
它没有尝试使用复制构造函数。它正在尝试使用赋值运算符。
-
不,阻止您使用赋值运算符的是 5.1.2.20 与 lambda 表达式关联的闭包类型具有已删除的 (8.4.3) 默认构造函数和已删除的复制赋值运算符.它有一个隐式声明的复制构造函数(12.8),并且可能有一个隐式声明的移动构造函数(12.8)。(嗯,那个,事实上 lambda 的类型不同)
-
如果你在第一个 lambda 之前加上
+,它就会神奇地开始工作。 -
@OmnipotentEntity 这纯粹是魔法,我不知道它是如何工作的!
+运算符是否启用了某些特殊功能!? -
@JohannesSchaub-litb 我想我解决了这个难题。评论有点长,所以我做了一个自我回答here。
标签: c++ c++11 lambda language-lawyer