【问题标题】:Lambda did not automatically deduce return typeLambda 没有自动推断返回类型
【发布时间】:2015-08-21 13:36:44
【问题描述】:

当我在 https://stackoverflow.com/a/32115498/383779 上回答我自己的问题时,我又有了疑问。

const CArray<CItem*>& Items=
    (ItemsInput!= nullptr)?
        *ItemsInput
    :
        [this]() -> const CArray<CItem*>&
        {
            CArray<CItem*> InnerItems;
            GetContainer().GetInnerItems(InnerItems, NULL, true);
            return (InnerItems);
        } ()
;

我尝试删除-&gt; const CArray&lt;CItem*&gt;&amp;返回部分,但编译时出现两个错误:

1>FunctionClass.cpp(line of last semicolon): error C2440: 'initializing' : cannot convert from 'void' to 'const CArray<TYPE> &'
1>          with
1>          [
1>              TYPE=CItem *
1>          ]
1>          Expressions of type void cannot be converted to other types


1>FunctionClass.cpp(line of the return statement): error C3499: a lambda that has been specified to have a void return type cannot return a value

有人可以解释为什么吗?不是应该让 lambda 自动从它的 return 语句中推断出要返回的类型吗?

【问题讨论】:

标签: c++ lambda return-type type-deduction


【解决方案1】:

来自 C++11 标准(N3242 5.1.2/4 确实是旧规范)

如果 lambda 表达式不包含尾随返回类型,则它是 好像尾随返回类型表示以下类型

——如果 复合语句的形式是

{ 属性说明符序列选择返回表达式; }

后面返回的表达式的类型 左值到右值的转换(4.1),数组到指针的转换 (4.2),以及函数到指针的转换(4.3);

——否则无效。

由于您的 lambda 不仅仅是返回表达式,因此返回类型为 void。

这被认为是 C++11 中的一个缺陷 (DR-985),许多编译器已经放宽了对 C++14 的这些限制,即使在 C++11 模式下也是如此(感谢@dyp)。

【讨论】:

  • 谢谢。但 DR-985 的链接实际上是“975。对 lambda 的返回类型扣除的限制”。所以它是 DR-975,而不是 DR-985。
【解决方案2】:

您需要使用 C++14 支持进行编译,以便在正文不仅仅是返回语句的情况下工作。您使用的是什么编译器和版本?

无论如何,您为什么返回 (InnerItems) 而不是 InnerItems ?是显式返回对该局部变量的引用吗?

【讨论】:

  • 错误消息表明 OP 正在使用 MSVC,它没有任何语言标准切换 AFAIK。
  • 我使用 Visual Studio 2013 和 Visual C++ 2010 编译工具包,所以它还不是 C++11,更不可能是 C++14!
  • @sergiol 也许你应该考虑切换到 Visual Studio 2015。
  • @Blacktempel 我希望我能更新。但是,升级到 Visual Studio 2015 的决定不在我的肩上。在软件公司工作时,老板们希望将稳定性风险降到最低。因此,他们等待更平静的工作时间,等待世界其他地方已经测试了基础软件的新版本。
  • @sergiol 这可能是真的,但升级会带来很多改进,性能和 C++11 / C++14 特性。决定权可能不在你手中,但没有什么能阻止你提出一个好的建议。也许提供更新并在它之后/同时针对您的解决方案的升级。我相信您的客户不会介意性能提升和/或新功能。
猜你喜欢
  • 2021-10-23
  • 1970-01-01
  • 2019-10-19
  • 2016-05-26
  • 2020-11-05
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
相关资源
最近更新 更多