【发布时间】:2015-07-18 17:38:12
【问题描述】:
考虑:
std::vector<std::function<void()>> vec;
something_unmovable m;
vec.push_back([&vec, m]() {
vec.resize(100);
// things with 'm'
});
vec[0]();
vec.resize(100) 可能会导致向量的重新分配,这意味着std::functions 将被复制到新位置,而旧的将被销毁。然而,当旧的仍在运行时,就会发生这种情况。这个特定的代码运行是因为 lambda 没有做任何事情,但我想这很容易导致未定义的行为。
那么,究竟发生了什么? m 仍然可以从向量中访问吗?或者是 lambda 的 this 指针现在无效(指向已释放的内存),因此 lambda 捕获的任何内容都无法访问,但是如果它运行的代码不使用它捕获的任何内容,它不是未定义的行为?
另外,lambda 可移动的情况有什么不同吗?
【问题讨论】:
-
“不可移动”是否意味着“不可复制”,还是
m可复制? (通常来说,如果某些东西是可复制的,那么它会自动移动,因为副本是移动的有效实现。)您不能制作捕获不可复制值的 lambda (demo)。 -
我认为“不可移动”是指仅删除了其他默认的移动构造函数。在这些假设下可以制作一个。我认为问题的重点是解决当捕获本身被破坏时 lambda 捕获的内容会发生什么。 AFAIK,它们的处理方式与结构相同。
标签: c++ c++11 lambda undefined-behavior