当我回答我自己的问题时https://stackoverflow.com/a/32115498/383779 https://stackoverflow.com/a/32115498/383779,我又有一个疑问了。
In
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 语句返回的类型吗?
来自 C++11 标准(N3242 5.1.2/4 它确实是旧规范)
如果 lambda 表达式不包含尾随返回类型,则它是
就好像 Trailing-return-type 表示以下类型:
— 如果
复合语句的形式为
{ 属性说明符-seq opt 返回表达式 ; }
之后返回的表达式的类型
左值到右值转换 (4.1)、数组到指针转换
(4.2),以及函数到指针的转换(4.3);
——否则无效。
因为你的 lambda 不仅仅是返回表达式,返回类型是 void。
这被认为是 C++11 中的缺陷(DR-985 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#975)并且许多编译器甚至在 C++11 模式下也放宽了对 C++14 的这些限制(感谢 @dyp)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)