Lambda没有自动推断返回类型

Lambda did not automatically deduce return type

本文关键字:返回类型 Lambda      更新时间:2023-10-16

当我在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);
        } ()
;

我试图删除-> const CArray<CItem*>&返回部分,但它在编译时给出了两个错误:

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自动推断要从返回语句返回的类型吗?

源自c++ 11标准(N3242 5.1.2/4)

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

-如果复合语句的形式为

{属性-指定符-seq选择返回表达式;}

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

-否则为void

因为你的lambda不只是返回表达式,所以返回类型是void。

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

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

在任何情况下,为什么你返回(InnerItems)而不是InnerItems ?是显式返回对该局部变量的引用吗?