Lambda没有自动推断返回类型

时间:2015-08-21 13:36:45

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

当我在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自动推断出从return语句返回的类型?

2 个答案:

答案 0 :(得分:6)

从C ++ 11标准(N3242 5.1.2 / 4,它真的是旧规范)

  

如果lambda表达式不包含trailing-return-type,则为   好像trailing-return-type表示以下类型

     

- 如果   复合语句的格式为

     

{attribute-specifier-seq opt return expression; }

     

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

     

- 否则,无效。

因为你的lambda不只是返回表达式,所以return-type是void。

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

答案 1 :(得分:1)

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

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