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

use*_*453 13 c++ lambda llvm clang c++11

我的书说:

具有函数体的Lambda包含除了单个return语句之外的任何未指定返回类型的返回void.

但是这个:

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

实际上编译并打印出"foo",但是lambda expr不仅仅包含一个return语句,因此它应该返回void,因为它不会手动指定" - > std :: string"作为返回类型.

这里发生了什么?

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

clang --version

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

Ben*_*igt 6

该书准确地反映了该标准的n3290草案中的规则.也许你的编译器实现了不同的草案.

在第5.1.2p4节中,草案如下

如果lambda表达式不包含trailing-return-type,则就好像trailing-return-type表示以下类型:

  • 如果compound-statement的格式为 { attribute-specifier-seq opt return 表达式 ; } ,则在lvalue-to-rvalue转换,数组到指针转换和函数到指针转换之后返回表达式的类型;
  • 否则,无效.

语法结构attribute-specifier-seq可以是alignas双括号属性.不是变量声明.

n3485草案,随后发布了C++ 11(即它正朝着C++ 1y的方向发展),包含相同的措辞.我不知道在某些草案中是否有一个不同于n3290的规则.