【发布时间】:2019-03-27 15:01:11
【问题描述】:
关于 lambda 的部分捕获 ([expr.prim.lambda.capture]/5) 声明
如果简单捕获中的标识符作为 lambda-declarator 的 parameter-declaration-clause 的参数的 declarator-id 出现,则程序格式错误。
考虑以下示例:
#include <iostream>
int main ()
{
auto foo = 1234;
auto bar = [foo](int foo) { std::cout << foo << '\n'; };
bar(4321);
}
最新的 GCC 版本(8.2.0 - 2018 年 7 月 26 日发布)对此没有诊断。最新的 Clang 版本(7.0.0 - 2018 年 9 月 19 日发布)也没有。
这些编译器是否应该有诊断(错误/警告)(如前所述 在参考)沿线:
// parameter and simple-capture have the same name
Godbolt 演示 here
【问题讨论】:
-
实际上我并没有真正看到这个例子的问题。看起来在其他地方的阴影不是错误,但从你引用的段落中我也希望这是一个错误
-
@user463035818 - 一个误解。在某些情况下,阴影已经是一个错误。例如,您不能在函数立即块中隐藏函数参数。
-
@StoryTeller 那么真的是一个误解。感谢您指出。我一直认为阴影无处不在......
-
@user463035818 - 这可能是因为您和其他任何理智的人一样,不会感到想要遮蔽他们只是定义为函数参数的东西的冲动 :) 标准只有那些病理情况标记为格式错误。
标签: c++ lambda language-lawyer