【问题标题】:Return type deduction with multi-statement lambdas使用多语句 lambda 的返回类型推导
【发布时间】:2013-01-22 02:27:01
【问题描述】:

我一直在编写代码,最近发现 g++ 不会警告我某类问题:根据 C++11 5.1.2.4,如果您的 lambda 不是单个 return 语句,那么返回类型必须声明为尾随返回类型或为 void。

虽然 g++ 允许编译无效代码,如果它足够有意义的话,有没有办法关闭这种行为(在 g++-4.7 中允许 -fpedantic)或者至少警告它?

示例代码:

[]() { return 0; } //is fine
[&a]() { a++; return 0; } //is not fine but g++ doesn't warn me
[&a]() -> int {a++; return 0; } //is fine again

C++11 5.1.2.4

实现不应将右值引用类型的成员添加到闭包类型。 如果 lambda-expression 不包含 lambda-declarator,就好像 lambda-declarator 是 ()。如果 lambda 表达式不包含 trailing-return-type,就好像 trailing-return-type 表示以下类型:

——如果复合语句的形式是
{ 属性说明符序列(选择)返回表达式; }
左值到右值转换(4.1)、数组到指针转换(4.2)和函数到指针转换(4.3)后返回的表达式的类型;

——否则,无效。

【问题讨论】:

  • +1 我注意到了,但我从未想过要尝试修复它。
  • 这不是一个扩展吗,就像只有一个语句一样推导出回报,他们期望这将被标准化?
  • @Potatoswatter,在这种情况下,它会在 VLA 上发出警告,那么为什么不这样做呢?
  • clang 3.2 和 VS2012 也接受该代码。
  • 这意味着如果你没有参数,你可以像这样声明你的 lambda:[]{return 0;}

标签: c++ c++11 lambda g++ trailing-return-type


【解决方案1】:

那是因为它是标准中的一个缺陷,将被更改(见DR 975):

975 对 lambda 的返回类型推导的限制

似乎没有任何技术上的困难 要求 lambda 的返回类型可以的当前限制 仅当 lambda 的主体由单个返回值组成时才被推导出 陈述。特别是,多个 return 语句可以是 如果它们都返回相同的类型,则允许。

我怀疑是否有办法将其关闭。

【讨论】:

  • @OmnipotentEntity:我再次更新了链接。看起来它已经从“准备”返回到“审查”状态以进行更多讨论,但我非常怀疑它会被拒绝。此外,提案的提交者也是 gcc 中的实施者,所以我怀疑无论如何要改变 gcc 中的行为。
  • 确实,从 C++14 开始,这个限制被解除了。
【解决方案2】:

GCC 4.8.1(可能更早)和 clang 3.3 已经实现了它;修复 DR975。

现在有一个提议 (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3386.html) 将其纳入 C++1y

【讨论】:

    猜你喜欢
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    相关资源
    最近更新 更多