gpt4 book ai didi

c++ - Lambda 没有自动推断返回类型

转载 作者:太空狗 更新时间:2023-10-29 20:11:39 25 4
gpt4 key购买 nike

当我在 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*>& return 部分,但是在编译时报了两个错误:

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,它确实是旧规范)

If a lambda-expression does not include a trailing-return-type, it isas if the trailing-return-type denotes the following type:

— if thecompound-statement is of the form

{ attribute-specifier-seq opt return expression ; }

the type of the returned expression afterlvalue-to-rvalue conversion (4.1), array-to-pointer conversion(4.2), and function-to-pointer conversion (4.3);

— otherwise, void.

因为你的 lambda 不仅仅是返回表达式,所以返回类型是 void。

这被认为是 C++11 ( DR-985) 中的一个缺陷,许多编译器放宽了对 C++14 的这些限制,即使在 C++11 模式下也是如此(感谢@dyp)。

关于c++ - Lambda 没有自动推断返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32141754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com