gpt4 book ai didi

c++ - 关键字 `this` 可以在类范围内使用吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:06 25 4
gpt4 key购买 nike

看来我可以在类范围内定义捕获 this 的 lambda 表达式。据我阅读 N4640 最新的工作草案,我找不到允许该行为的句子。我想我错过了什么......

这是一个例子:

#include <iostream>
#include <functional>

struct foo {
std::function<void()> f1 = [this]{ ++i; };
int i = 0;
};

int main() {
foo a;
foo const& cref = a;
cref.f1();
std::cout << a.i << std::endl;
}

运行演示。 (g++ -std=c++11 迂腐) https://wandbox.org/permlink/HPzaOxbBkOQOmuS6

已更新

感谢@Brian 和@cpplerner 的评论,我明白了我的基本问题是什么。那就是“是否允许在类范围内使用关键字 this?不仅是非静态成员函数范围。”如果是这样,我可以在类范围内的 lambda 表达式捕获列表中使用 this。非常清楚。

类作用域中的this似乎是非常量指针。

为了解决我的本质问题,我阅读了N4640 9.2.2.1 The this pointer [class.this]。语法上好像是允许的,但是找不到语义描述。对于非静态成员函数,我在9.2.2/3和9.2.2/4找到了语义描述。

已更新

我更新了问题的标题以代表我的基本问题。

最初的问题标题是类作用域中的 lambda 表达式可以捕获这个吗?

最佳答案

回答的动机(我自己)

感谢评论,我的问题解决了。我使用看到问题的其他人的评论来总结问题的答案。

关键字this可以在类作用域中使用吗?

是的。根据[expr.prim.this] ,

“关键字 this 命名指向对象的指针,为其调用非静态成员函数或评估非静态数据成员的初始值设定项 ([class.mem])。”

参见 @T.C 's comment .

关键字this可以写在类作用域的lambda表达式的捕获列表中吗?

没有。

至少在 C++ 标准的当前草案中 n4618 , 但 C++ 标准委员会认可为 issue .

这是不允许this的原因。

根据 expr.prim.lambda ,

“最小封闭范围是 block 范围的lambda 表达式是*局部lambda 表达式;任何其他lambda 表达式 不应有捕获-defaultsimple-capture 在其 lambda-introducer 中。”

类作用域中的lambda 表达式 不是本地lambda 表达式。因为一个class scope不是 block scope .这是block这个词的定义.

所以类 scple 中的 lambda-expression 在其 lambda- 中不应有 capture-defaultsimple-capture介绍人

关键字 thissimple-capture 之一。参见 expr.prim.lambda.capture .

因此,类范围内的 lambda 表达式 无法捕获 this

查看此 @cpplearner 's comment@T.C 's comment .

编译器实现

我在 g++ 和 clang++ 上测试了以下代码。

#include <iostream>
#include <functional>

struct foo {
std::function<void()> lambda_in_class_scope = [this]{
std::cout << this << std::endl;
};
};

int main() {
foo f;
std::cout << &f << std::endl;
f.lambda_in_class_scope();
}

输出:

0x7fff8f409cb0
0x7fff8f409cb0

我得到了相同的地址。这表明 this 被正确捕获。

这里是运行演示:

g++ 6.3 https://wandbox.org/permlink/FdhxJhVvripOQ1ng

clang ++ 4.0 https://wandbox.org/permlink/kGoNBIoV5WTZV0sy

关于c++ - 关键字 `this` 可以在类范围内使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43649241/

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