C++ Lambda没有自动推断返回类型

C++ Lambda没有自动推断返回类型,c++,lambda,return-type,type-deduction,C++,Lambda,Return Type,Type Deduction,当我回答自己的问题时,我又有了一个疑问 在 const CArray和项目= (ItemsInput!=nullptr)? *项目输入 : [这]()->康斯特·卡雷& { 卡雷内件; GetContainer().GetInnerItems(InnerItems,NULL,true); 退货(内部项目); } () ; 我试图删除->const CArray&返回部分,但编译时出现两个错误: 1>FunctionClass.cpp(line of last semicolon): er

当我回答自己的问题时,我又有了一个疑问

const CArray和项目=
(ItemsInput!=nullptr)?
*项目输入
:
[这]()->康斯特·卡雷&
{
卡雷内件;
GetContainer().GetInnerItems(InnerItems,NULL,true);
退货(内部项目);
} ()
;
我试图删除
->const CArray&
返回部分,但编译时出现两个错误:

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
1>FunctionClass.cpp(最后一行分号):错误C2440:“初始化”:无法从“void”转换为“const CArray&”
1> 与
1>          [
1> 类型=CItem*
1>          ]
1> void类型的表达式无法转换为其他类型
1> FunctionClass.cpp(返回语句的行):错误C3499:指定为具有void返回类型的lambda无法返回值
有人能解释一下原因吗?难道lambda不应该自动从其返回语句中推断要返回的类型吗?

来自C++11标准(N3242 5.1.2/4这是一个非常古老的规范)

如果lambda表达式不包含尾随返回类型,则为 似乎尾随返回类型表示以下类型

-如果 复合语句的形式如下

{属性说明符seq opt返回表达式;}

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

-否则无效。

因为lambda不仅仅是返回表达式,所以返回类型是void


这被认为是C++11()中的一个缺陷,许多编译器甚至在C++11模式下也放宽了对C++14的限制(感谢@dyp)。

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


在任何情况下,为什么返回(InnerItems)而不是InnerItems?是明确地返回对该局部变量的引用吗?< /P>错误消息表明OP使用MSVC,它没有任何语言标准交换机。我使用Visual Studio 2013使用Visual C++ 2010编译工具包,所以它甚至还没有C++ 11,甚至更少的可以是C++ 14!也许你应该考虑切换到Visual Studio 2015。@布莱克特默尔,希望我能更新。然而,发展到VisualStudio2015的决定并不在我的肩上。在软件公司工作时,老板们希望将稳定性风险降至最低。因此,他们等待更平静的工作时间,等待世界其他地方已经测试了一个基本软件的新版本。@sergiol这可能是真的,但升级将带来很多改进、性能和C++11/C++14功能。这个决定可能不在你手中,但没有什么能阻止你提出一个伟大的建议。可能会提供更新,并在更新之后/同时针对您的解决方案进行升级。我相信您的客户不会介意性能提高和/或新功能。可能重复:也相关:您不能将引用(
const
)返回到局部变量。另请参见,和。谢谢。但DR-985的链接实际上是“975.对lambdas返回类型扣除的限制”。所以是DR-975,不是DR-985。
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