使用初始值设定项和目标 C++ 捕获 Lambda

Lambda captures with initializers and Objective-C++

提问人:Fabio A. 提问时间:5/3/2023 最后编辑:cigienFabio A. 更新时间:5/4/2023 访问量:78

问:

尝试以下代码,写入文件并编译.mmg++ -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++ 完全不同。实际上,它看起来和都正在被捕获,然后被分配值 。cxcx

事实上,以下代码以 的代码 退出,这证明了上述内容。2

int x = 1;
int c;
auto a = [c = x]{return c+x;};

int main() {
    return a();
}

没有在任何地方找到记录甚至讨论过,肯定是我的错吗?有没有人可以指向有关此事的任何形式的(非)官方文件?这是特定实现的问题,还是语言限制?

C +17 闭包 Objective-C++

评论

0赞 pmdj 5/3/2023
您可能需要在编译器命令行上指定要面向的 C++ 版本。例如,对于 。在 Xcode 目标的生成设置中,可以在“Apple Clang - 语言 - C++”部分中为“C++ 语言方言”选择该设置。clang-std=c++17
0赞 pmdj 5/3/2023
如果依赖于微妙的特定于版本的功能,那么可能还值得将类似的东西放在编译单元的顶部附近。static_assert(__cplusplus >= 201703L, "This file uses C++17 features");
1赞 Fabio A. 5/3/2023
我已经指定了版本,在我帖子的开头就说明了这一点。
0赞 Moia 5/3/2023
第一个代码片段是有效的 C++17 代码,因此它应该与 Objective-C++ 相关
1赞 Eljay 5/3/2023
我在执行第一个代码片段时没有得到。使用 Apple clang 版本 14.0.3 (clang-1403.0.22.14.1)。error: 'c' was not declared in this scopeclang++ -std=c++17 FabioA.mm

答:

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 不应捕获任何内容,它会在捕获列表中声明一个新变量,将其值分配给全局范围,然后引用。全局变量根本不应该改变cxxc