当我看到下面的工作时,我有点困惑。
struct A {
void g(){}
void f(){
[&](){ g(); }();
}
};但是,我找到了this的答案,它非常详细地解释了这是如何工作的。
本质上,它归结为this是由值捕获的,无论您是使用[=]还是[&]。
但是,在优先选择上,我阅读了以下内容
如果存在两个捕获默认值,则可以隐式捕获当前对象
(*this)。如果隐式捕获,则始终通过引用捕获,即使默认捕获为=。
因此,我有两个公式,它们似乎是等价的
this是由值捕获的,无论我们使用[=]还是[&]。(*this)是通过引用捕获的,不管我们是使用[=]还是[&]。首先,上述两种提法是否完全等同?
我确实看到了两者之间的不同,如果不是在实际可能性上,至少在它们看起来有多有用。
配方1对我来说很奇怪。为什么我不让this被const-reference捕获?就性能而言,这两种情况不应该有太大的差别,而且我总是可以在lambda之前执行auto const& This = this;,然后通过引用捕获This (如果我想的话)。关于悬空引用,如果我使用this关键字,我在object类中,那么当我在对象类中时,对象如何死亡?
另一方面,公式2似乎确实保护了我,避免在使用(*this)时被值捕获时发生的不必要的复制。此外,如果我真的愿意的话,有一个通过复制捕获(*this)的捕获语法,即[*this]。
发布于 2021-03-08 18:09:56
第一种解释是C++17之前的意图(当这个答案被写出来时),但是第二种是自那以后的意图(反映在始终存在的current上)。最初,人们认为this (指针)是捕获的对象,当然不可能通过引用(作为指出;如果引入临时的话const auto &x=…;是完全不同的)。C++17引入了捕获*this (按值),将现有的捕获[this]重新解释为有效的[&*this] (这实际上不是有效的语法)。
C++20继续转型,弃用
struct A {
auto f() {return [=] {return this;}}
};因为它实际上不按值捕获任何东西,相反,允许 [=,this]现在被理解为“按值捕获除*this以外的所有东西”,而不是多余的“按值捕获所有东西,也按值捕获this”。相反,[&,this]现在应该被认为是冗余,但还没有被废弃(目前)。
发布于 2021-03-08 17:50:15
首先,上述两种提法是否完全等同?
你可以认为它们在功能上是相同的,但第二种方式并不是最好的思维方式。this总是由值捕获的。但是正弦this是一个指针,被捕获的值只是指向该对象的指针。因此,您可以从概念上将其视为捕获通过指针引用所指向的对象。
为什么要阻止我引用这个?
因为表达式this是一个prvalue。没有可以引用的名为this的对象。这就是为什么如果你做auto& This = this;,你就是获取编译错误。
记住:this是指向对象的指针。指针是prvalue;要指向的对象不是。
关于悬空引用,如果我使用this关键字,我在object类中,那么当我在其中时,对象如何死亡?
除了可以调用this->~Typename()来销毁对象之外,lambda只是一个可调用的对象。它可以在创建它的位置的边界之外持续存在。它可以返回(可以通过类型擦除(比如通过std::function )或者通过auto返回类型推断),也可以传递给其他人并存储在对象的范围之外。
https://stackoverflow.com/questions/66534397
复制相似问题