【发布时间】:2018-06-08 18:03:44
【问题描述】:
这是我生成错误的示例代码:
#include <functional>
using namespace std;
struct S {
S() = default;
S(const S&) = delete;
S(S&&) = default;
S& operator=(const S&) = delete;
S& operator=(S&&) = delete;
};
template <typename F>
void post(F&& func)
{
function<void()> f{forward<F>(func)};
}
int main()
{
S s;
post([s2 = move(s)] { });
}
在main() 的lambda 内部,我使用std::move() 捕获局部变量s。在调用 post() 之前,s2 必须已经移动构造成功。
但是,在 post() 内部,f 不能使用对此 lambda 类型的右值引用来构造。
如果我删除,s2 = move(s),f 可以用这个右值引用构造。
为什么添加s2 = move(s) 会导致 lambda 不可移动?
这里是link 尝试使用 coliru。
【问题讨论】:
-
@Lưu Vĩnh Phúc,请告诉我你为什么不喜欢我的问题。
-
是什么让你觉得我不喜欢它?我只是为语法高亮添加了一个标签
-
对不起,我误解了修订日志,并认为你给了问题-1。
-
还有一个事实是 S 有构造函数,它接受 S 实例而不是 S 引用。我必须删除那些才能到达 lambda。
-
@SornelHaetir,怎么样?可以和
S(const S&) = delete共存吗?它们是哪些?
标签: c++ function lambda c++14 move