首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lambda未自动推导返回类型

Lambda未自动推导返回类型
EN

Stack Overflow用户
提问于 2015-08-21 21:36:45
回答 2查看 440关注 0票数 3

当我在https://stackoverflow.com/a/32115498/383779上回答我自己的问题时,我又有了一个疑问。

在……里面

代码语言:javascript
复制
const CArray<CItem*>& Items=
    (ItemsInput!= nullptr)?
        *ItemsInput
    :
        [this]() -> const CArray<CItem*>&
        {
            CArray<CItem*> InnerItems;
            GetContainer().GetInnerItems(InnerItems, NULL, true);
            return (InnerItems);
        } ()
;

我试图删除-> const CArray<CItem*>&返回部分,但在编译时出现了两个错误:

代码语言:javascript
复制
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语句中推导出要返回的类型吗?

EN

回答 2

Stack Overflow用户

发布于 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)。

票数 6
EN

Stack Overflow用户

发布于 2015-08-21 21:43:08

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

无论如何,为什么要返回( InnerItems )而不是InnerItems?是否显式返回对该局部变量的引用?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32141754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档