gpt4 book ai didi

c++ - 使用任一默认捕获模式时,这是通过复制捕获还是 (*this) 通过引用捕获?是同一回事吗?

转载 作者:行者123 更新时间:2023-12-04 02:27:20 25 4
gpt4 key购买 nike

看到下面的工作我有点纳闷

struct A {
void g(){}
void f(){
[&](){ g(); }();
}
};

但后来我发现this答案非常详细地解释了它是如何工作的。

本质上,它归结为 this 无论您使用 [=] 还是 [&] 都是按值捕获的/em>.

然而,关于 cppreference我阅读了以下内容

The current object (*this) can be implicitly captured if either capture default is present. If implicitly captured, it is always captured by reference, even if the capture default is =.

所以我有两个似乎等价的公式

  1. this 无论我们使用 [=] 还是 [&] 都是按值捕获的。
  2. 无论我们使用 [=] 还是 [&]
  3. (*this) 都是通过引用捕获的。

首先,以上两个公式是否完全等价?

我确实看到了两者之间的区别,即使不是在实际可能性方面,至少在它们看起来有多有用方面也是如此。

公式 1 对我来说似乎很奇怪。为什么阻止我通过 const-reference 捕获 this?在性能方面,这两种情况应该没有太大区别,我总是可以在 lambda 之前执行 auto const& This = this;,然后通过以下方式捕获 This引用,如果我想的话。关于悬挂引用,如果我使用 this 关键字,我在对象类中,那么当我在其中时对象怎么会死掉呢?

另一方面,如果 (*this) 在使用 [=] 时被值捕获,公式 2 似乎确实可以防止我进行不必要的复制>。此外,如果我真的想要,有一个捕获语法用于通过复制捕获 (*this),即 [*this]

最佳答案

第一个解释是 C++17 之前的意图(在编写该答案时),但第二个是此后的意图(如当前的 cppreference 所反射(reflect))。最初认为this(指针)是捕获的对象,当然不可能通过引用(如pointed outconst auto &x=…; 如果它引入一个临时变量则完全不是一回事)。 C++17 引入了捕获 *this(按值),将现有捕获 [this] 重新解释为有效的 [&*this](这实际上不是有效的语法)。

C++20 继续过渡,deprecating

struct A {
auto f() {return [=] {return this;}}
};

因为它实际上并没有按值捕获任何东西,相反 allowing [=,this] 现在被理解为“通过 的值捕获所有内容,*this”而不是冗余的“通过以下方式捕获所有内容”值以及 this 按值”。相反,[&,this] 现在应该被认为是冗余,但它还没有被弃用(还)。

关于c++ - 使用任一默认捕获模式时,这是通过复制捕获还是 (*this) 通过引用捕获?是同一回事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66534397/

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