提问人:Fabio A. 提问时间:5/3/2023 最后编辑:cigienFabio A. 更新时间:5/4/2023 访问量:78
使用初始值设定项和目标 C++ 捕获 Lambda
Lambda captures with initializers and Objective-C++
问:
尝试以下代码,写入文件并编译.mm
g++ -std=c++17
int x;
auto a = [c = x]{};
它会导致编译器抱怨
error: 'c' was not declared in this scope
因此,在我看来,Objective-C++ 不支持带有捕获初始值设定项的 lambda。
在试验它时,我还注意到以下内容编译成功:
int x;
int c;
auto a = [c = x]{};
但行为与纯 C++ 完全不同。实际上,它看起来和都正在被捕获,然后被分配值 。c
x
c
x
事实上,以下代码以 的代码 退出,这证明了上述内容。2
int x = 1;
int c;
auto a = [c = x]{return c+x;};
int main() {
return a();
}
没有在任何地方找到记录甚至讨论过,肯定是我的错吗?有没有人可以指向有关此事的任何形式的(非)官方文件?这是特定实现的问题,还是语言限制?
答:
1赞
The Dreams Wind
5/4/2023
#1
没有在任何地方找到记录甚至讨论过,肯定是我的错吗?有没有人可以指向有关此事的任何形式的(非)官方文件?这是特定实现的问题,还是语言限制?
在 Objective-C++ 中对 lambda 没有任何限制。本质上,目标 C++ 是 C++ 的超集,编译器应该能够正确解释(任何)合法的 C++ 代码。您提供的每个代码片段以及以下代码:
int x = 1;
auto a = [c = x]{ return c + x; };
int main()
{
return a();
}
...使用以下一组标志在 MacOS 上使用 Apple Clang 14 进行编译而不会出现问题:
% clang -x objective-c++ --std=c++17 Lambda.mm
您观察到的行为很可能是 GCC 错误,不需要任何文档,需要修复。
评论
0赞
Fabio A.
5/4/2023
我实际上也不知道捕获初始值设定项的哪个部分的变量。有参考标准的地方吗?打开了错误报告:gcc.gnu.org/bugzilla/show_bug.cgi?id=109728
0赞
The Dreams Wind
5/4/2023
@FabioA。在最后一个示例中,Lambda 不应捕获任何内容,它会在捕获列表中声明一个新变量,将其值分配给全局范围,然后引用。全局变量根本不应该改变c
x
x
c
评论
clang
-std=c++17
static_assert(__cplusplus >= 201703L, "This file uses C++17 features");
error: 'c' was not declared in this scope
clang++ -std=c++17 FabioA.mm