在C 11中使用lambda默认捕获值或引用的缺点?

前端之家收集整理的这篇文章主要介绍了在C 11中使用lambda默认捕获值或引用的缺点?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在C 11中使用lambda默认捕获值([=])或引用([&])有什么缺陷?

我知道一些陷阱,如:

>如果从lambda创建的闭包的生命周期超过了局部变量的生命周期,则闭包中的引用将是悬空的?

按值划分的默认值是否有任何缺点?

解决方法

我认为你提到的悬空参考问题是主要的陷阱.

然而,另一件有时被忽略的事情是,即使在成员函数中使用了按值捕获的lambda,它也不会创建使用过的成员变量的副本,而只会生成this指针的副本.

首先,这意味着您再次对悬空指针问题开放问题,其次,您可能会意外地修改lambda范围之外的变量,即使它看起来像,您只是修改本地副本.

例如.这将打印0 1 1而不是0 1 0

struct Foo {
    int bar=0;
    int bas() {
        auto inc = [=]() {          
            bar++;  //this is equivalent to this->bar++ 
            return bar; 
        };
        return inc();
    }
};

int main() {
    Foo foo;
    std::cout << foo.bar <<" ";
    std::cout << foo.bas() << " ";
    std::cout << foo.bar << std::endl; 
}

编辑:只是为了避免与@Snps的观点相关的混淆:如果bar是bas()中的局部变量(因此可以通过值捕获),则上述lambda将无法编译,因为by-value-captured-variables默认为const,除非您明确指定lambda为mutable.因此,如果您考虑一下,很明显bar不会被复制,但在阅读或编写代码时很容易被遗忘.

原文链接:/c/116999.html

猜你在找的C&C++相关文章