【问题标题】:No compiler diagnostic when identifier in a simple-capture appears as the declarator-id of a parameter当简单捕获中的标识符显示为参数的声明符 ID 时,没有编译器诊断
【发布时间】: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


【解决方案1】:

该措辞已添加到 C++17 以解决 CWG Defect 2211。它在 C++14 中不存在,而且 Clang 和 GCC 似乎还没有赶上你正在检查的版本的这种变化。

值得注意的是,GCC 主干确实将该程序诊断为 C++17 下的格式错误。

【讨论】:

  • 有没有办法检查编译器版本是否考虑到标准的此类更新?比较日期似乎没有帮助。 2017 年 2 月建议解决此问题。GCC 8.2 于 2018 年 7 月 26 日发布。
  • @P.W - 一般来说?不,这完全取决于编译器的开发过程、发行说明和文档。
  • 现在已在 clang 主干中修复 :)
猜你喜欢
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 2021-09-29
  • 2014-08-17
  • 1970-01-01
相关资源
最近更新 更多