Lambda没有自动推断返回类型
Lambda did not automatically deduce return type
当我在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自动推断要从返回语句返回的类型吗?
源自c++ 11标准(N3242 5.1.2/4)
如果lambda表达式不包含尾随返回类型,则为尾随返回类型就好像尾随返回类型表示以下类型:
-如果复合语句的形式为
{属性-指定符-seq选择返回表达式;}
后返回表达式的类型左值到右值转换(4.1),数组到指针转换(4.2)和函数到指针的转换(4.3);
-否则为void
因为你的lambda不只是返回表达式,所以返回类型是void。
这被认为是c++ 11 (DR-985)中的一个缺陷,即使在c++ 11模式下,许多编译器也放宽了对c++ 14的这些限制(感谢@dyp)。
您需要编译c++ 14支持,以便在body不仅仅是返回语句的情况下工作。您使用的是什么编译器和版本?
在任何情况下,为什么你返回(InnerItems)而不是InnerItems ?是显式返回对该局部变量的引用吗?
相关文章:
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 有没有办法根据 lambda 参数返回类型部分专用化我的模板化函数?
- 如何推导lambda的返回类型
- 尽管显式声明了返回类型,但对lambda的调用是不明确的
- 是否创建具有不同返回类型的lambda
- 防止 lambda 的返回类型扣除
- 我可以让返回类型自动处理具有相同签名但捕获不同内容的 lambda 吗?
- 如何通过返回类型区分两个 lambda 函数?
- 如何在C++中比较 lambda 函数的返回类型?
- 获取模板函数/泛型 lambda 的唯一返回类型
- 尝试使用具有尾随返回类型的 lambda 进行 SFINAE 时出现硬错误
- 具有尾随返回类型的通用 lambda,具体取决于 C++11 中的可变参数
- IF-ELSE语句的Lambda表达式的返回类型扣除
- 在 C++14 中使用通用 lambda 和自动返回类型特征获得不同的结果
- 尝试传递 constexpr lambda 并使用它来显式指定返回类型
- 如何用clang格式分隔lambda的尾部返回类型
- 无法使用 std::map 推断 lambda 的返回类型
- 访问lambda尾随返回类型中的概括捕获对象
- 通用lambda,继承和尾随返回类型:此有效代码
- 是否可以通过从lambda的引用中返回T型对象,而无需使用尾随返回类型语法