gpt4 book ai didi

c++ - 强制 C++11 lambda 捕获变量

转载 作者:可可西里 更新时间:2023-11-01 18:37:43 26 4
gpt4 key购买 nike

假设复制变量有必要的副作用。我想声明一个复制变量但不使用变量的 lambda。执行此操作的最低要求是多少?

Copiable copyable;

auto lambda1 = [=](){};
auto lambda2 = [copyable](){};
auto lambda3 = [=](){ copyable; }
auto lambda4 = [=](){ volatile copy = copyable; }

lambda1 使用隐式捕获,并且由于正文中没有提到 copyable,我不相信它实际上复制了它。

lambda2 使用显式捕获,它似乎根据 this ,它应该通过复制捕获。是否允许编译器省略拷贝?参见 this对此进行另一次讨论。

lambda3 使用隐式捕获,但主体提到了 copyable。这是否构成 copyableodr-use

lambda4 使用隐式捕获并强制另一个 volatile 拷贝。我确信这确实有效,但它所做的拷贝比最小拷贝更多。

激励案例:我需要在完成任意数量的 lambda 调用后运行清理,可能在不同的线程中。我可以通过将 std::shared_ptr 与运行清理的自定义删除器一起使用,并以某种方式将其传递给每个 lambda 来实现。然后,当所有共享指针超出范围时,将运行清理。

编辑:lambda3lambda4 缺少用于隐式捕获的 =

最佳答案

What's the minimum required to do this?

按值显式捕获,如 lambda2

lambda1 uses implicit capture, and since the body doesn't mention copyable, I don't believe it actually copies it.

没错。只有当变量在 lambda 中被odr-used时,它们才会被隐式捕获。

lambda2 uses explicit capture, and it seems according to this, it should capture by copy.

没错。任何显式捕获的变量都将被捕获,无论它们是否被使用。这是您要确保捕获对象的操作。

Is the compiler allowed to elide the copy? See this for another discussion of this.

没有。如果捕获了一个变量,那么它就被捕获了。该链接并没有真正“讨论”那个;唯一的答案确认是这种情况,并使用标准中的适当措辞。

lambda3 uses implicit capture but the body mentions copyable. Does this constitute an odr-use of copyable?

是的。 odr-use 的定义是

A variable whose name appears as a potentially-evaluated expression is odr-used unless it is an object that satisfies the requirements for appearing in a constant expression and the lvalue-to-rvalue conversion is immediately applied.

并且异常不适用,因为它不是常量(因此不能出现在常量表达式中)。 (但请注意,这是错误的格式,因为没有默认捕获。)

lambda4 uses implicit capture and forces another volatile copy. I'm sure this will actually work, but it's doing more copies than the minimum.

的确;您通过使用该值强制隐式捕获,并强制执行额外的拷贝。这是不必要的,因为 lambda2 会做你想做的事。

关于c++ - 强制 C++11 lambda 捕获变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25780002/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com