gpt4 book ai didi

c++ - 我的书对 lambda 返回类型的讨论是错误的吗?

转载 作者:IT老高 更新时间:2023-10-28 23:00:43 25 4
gpt4 key购买 nike

我的书是这样说的:

Lambdas with function bodies that contain anything other than a single return statement that do not specify a return type return void.

但是这个:

auto f = []{
int i=0; i++;
return std::string("foo");
};
std::cout << f() << std::endl;

实际上编译并打印出“foo”,但是 lambda expr 不仅仅是一个返回语句,因此它应该返回 void,因为它没有手动指定“-> std::string”作为返回类型。

这是怎么回事?

我在最新的 Xcode 4.6 中使用 Apple 的编译器,似乎基于 Clang 3.2:

clang --version

Apple LLVM 版本 4.2 (clang-425.0.24)(基于 LLVM 3.2svn)目标:x86_64-apple-darwin12.2.0线程模型:posix

最佳答案

本书准确地反射(reflect)了标准草案 n3290 中的规则。也许您的编译器实现了不同的草案。

在第 5.1.2p4 节中,草案内容如下

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

  • if the compound-statement is of the form { attribute-specifier-seqopt return expression ; } the type of the returned expression after lvalue-to-rvalue conversion, array-to-pointer conversion, and function-to-pointer conversion;
  • otherwise, void.

句法构造 attribute-specifier-seq 可以是 alignas 或双括号属性。不是变量声明。

在 C++11 发布之后的 n3485 草案(即,它正在朝着 C++1y 发展)包含相同的措辞。不知道在 n3290 之前的某个草案中是否有不同的规则。

关于c++ - 我的书对 lambda 返回类型的讨论是错误的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14738335/

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