考虑一下:
#include <functional>
#include <iostream>
std::function<void()> make_function(int& x) {
    return [&]{ std::cout << x << std::endl; };
}
int main() {
    int i = 3;
    auto f = make_function(i);
    i = 5;
    f();
}
是否保证在5不调用未定义行为的情况下输出该程序?
我理解如果我x通过value([=])捕获它是如何工作的,但我不确定我是否通过引用捕获它来调用未定义的行为.可能是我在make_function返回后最终会有一个悬空引用,或者只要原始引用的对象仍然存在,捕获的引用是否可以保证工作?
在这里寻找明确的基于标准的答案:) 到目前为止它在实践中运作良好;)
我迷失了吗?这总是允许的吗?
#include <iostream>
int main()
{
    auto& os = std::cout;
    auto write = []()
    {
        os << "what\n";
    };
    write();
}
我正在使用:
Apple LLVM 10.0.0版(clang-1000.10.44.4)
目标:x86_64-apple-darwin17.7.0
虽然也看到Coliru:
我一直认为空捕获不会捕获任何东西.
的确,MSDN 说:
空捕获子句[]表示lambda表达式的主体不会访问封闭范围中的变量.
进一步的研究表明,这实际上可以捕捉const东西(我也不知道,但无论如何),但os不是const(没有参考!虽然它是不可改变的......).
当我打开-Wextra并注意到Clang认为&os捕获(存在于我的真实代码中)是不必要的时候,我偶然发现了这一点.删除它我错开了发现构建工作.
我有与此类似的C ++ 14代码:
void C::f() {
  int& ref = this->x;
  auto lb = [&ref]() {
    /* do stuff with "ref" */
  };
  if (foobar) {
    // call lb when signal fires. 
    connect(object, &D::signal, [&lb]() {
      lb();
    });
  } else {
    lb();
  }
}
我知道到我使用时lb,它this仍然有效。但是ref和lb。上面的代码有悬挂的参考吗?
我正在进行std::vector回调std::function,而我在理解捕获时遇到了一些麻烦.当我尝试使用它们时,它们似乎超出了范围,如果我通过引用捕获它们.如果我按价值捕获,一切正常.
使用这些回调函数的代码需要一定的签名,所以假设我无法修改使用它们的代码,我需要坚持使用捕获变量而不是将事物作为函数参数传递.
当被localVar捕获?是在定义lambda还是调用lambda时?答案是否会根据我是按值还是参考来捕获?
这是我想要了解的一个小例子:
#include <iostream>
#include <functional>
#include <vector>
int main(int argc, char **argv)
{
    int n(5);
    // make a vector of lambda functions
    std::vector<std::function<const int(void)> > fs;
    for(size_t i = 0; i < n; ++i){
        int localVar = i;
        auto my_lambda = [&localVar]()->int // change &localVar to localVar and it works
        {
            return localVar+100;
        };
        fs.push_back(my_lambda);
    }
    // use the vector of lambda functions
    for(size_t i = 0; i < n; …