当我在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语句返回的类型?
答案 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?是显式返回对该局部变量的引用吗?