相关疑难解决方法(0)

在C++ 11 lambda中通过引用捕获引用

考虑一下:

#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();
}
Run Code Online (Sandbox Code Playgroud)

是否保证在5不调用未定义行为的情况下输出该程序?

我理解如果我x通过value([=])捕获它是如何工作的,但我不确定我是否通过引用捕获它来调用未定义的行为.可能是我在make_function返回后最终会有一个悬空引用,或者只要原始引用的对象仍然存在,捕获的引用是否可以保证工作?

在这里寻找明确的基于标准的答案:) 到目前为止它在实践中运作良好;)

c++ lambda language-lawyer c++11

59
推荐指数
2
解决办法
2万
查看次数

lambda捕获的std :: cout的本地引用,而不需要它

我迷失了吗?这总是允许的吗?

#include <iostream>

int main()
{
    auto& os = std::cout;

    auto write = []()
    {
        os << "what\n";
    };

    write();
}
Run Code Online (Sandbox Code Playgroud)

我正在使用:

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++ lambda language-lawyer c++17

33
推荐指数
1
解决办法
689
查看次数

Lambda被引用捕获并在广告位中使用

我有与此类似的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();
  }
}
Run Code Online (Sandbox Code Playgroud)

我知道到我使用时lb,它this仍然有效。但是reflb。上面的代码有悬挂的参考吗?

我发现了类似的问题(在这里那里,...),但我无法得出结论。

c++ c++14

5
推荐指数
1
解决办法
161
查看次数

何时捕获捕获变量?

我正在进行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; …
Run Code Online (Sandbox Code Playgroud)

c++ lambda c++11 std-function

1
推荐指数
1
解决办法
91
查看次数

标签 统计

c++ ×4

lambda ×3

c++11 ×2

language-lawyer ×2

c++14 ×1

c++17 ×1

std-function ×1