当我在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语句中推导出要返回的类型吗?
发布于 2015-08-21 21:41:51
来自C++11标准(N3242 5.1.2/4,它是非常旧的规范)
如果lambda表达式不包含尾随返回值类型,则如同拖尾返回值类型表示以下类型:
-如果复合语句的形式为
{ attribute-specifier-seq opt return expression;}
左值到右值转换(4.1)、数组到指针转换(4.2)和函数到指针转换(4.3)后返回的表达式的类型;
-否则为。void
因为您lambda不仅仅是返回表达式,所以return-type是void。
这被认为是C++11 (DR-985)的一个缺陷,许多编译器甚至在C++11模式下也放宽了对C++14的限制(感谢@dyp)。
发布于 2015-08-21 21:43:08
您需要使用C++14支持进行编译,以便在正文不仅仅是一个返回语句的情况下工作。你使用的是什么编译器和版本?
无论如何,为什么要返回( InnerItems )而不是InnerItems?是否显式返回对该局部变量的引用?
https://stackoverflow.com/questions/32141754
复制相似问题