gpt4 book ai didi

c++ - 关于 lambda、函数指针的转换和私有(private)数据成员的可见性

转载 作者:IT老高 更新时间:2023-10-28 22:26:42 25 4
gpt4 key购买 nike

考虑以下示例:

#include <cassert>

struct S {
auto func() { return +[](S &s) { s.x++; }; }
int get() { return x; }

private:
int x{0};
};

int main() {
S s;
s.func()(s);
assert(s.get() == 1);
}

它可以使用 G++ 和 clang 进行编译,所以我很想这是标准所允许的。但是,lambda 没有捕获列表并且它不能拥有它,因为 + 强制转换为函数指针。因此,我认为不允许访问 S 的私有(private)数据成员。
相反,如果它被定义为静态成员函数,它的行为或多或少会如何。

到目前为止,一切都很好。如果我以前知道,我会经常使用这个技巧来避免编写冗余代码。

我现在想知道的是在标准(工作草案很好)中定义的位置,因为我无法找到该部分、项目符号或任何关于它的规则。
lambda 是否有任何限制,或者它完全就像它被定义为静态成员函数一样工作?

最佳答案

对于成员函数内部的 lambda 表达式,根据 §8.4.5.1/2 Closure types [expr.prim.lambda.closure] :

The closure type is declared in the smallest block scope, class scope, or namespace scope that contains the corresponding lambda-expression.

这意味着 lambda 闭包类型将在成员函数内声明,即本地类。根据 §14/2 Member access control [class.access] :

(强调我的)

A member of a class can also access all the names to which the class has access. A local class of a member function may access the same names that the member function itself may access.

这意味着对于 lambda 表达式本身,它可以访问 private S 的成员, 与成员函数 func 相同.

还有 §8.4.5.1/7 Closure types [expr.prim.lambda.closure] :

(强调我的)

The closure type for a non-generic lambda-expression with no lambda-capture whose constraints (if any) are satisfied has a conversion function to pointer to function with C++ language linkage having the same parameter and return types as the closure type's function call operator. ... The value returned by this conversion function is the address of a function F that, when invoked, has the same effect as invoking the closure type's function call operator.

这意味着当转换的函数指针被调用时,同样的规则适用。

关于c++ - 关于 lambda、函数指针的转换和私有(private)数据成员的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48626987/

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