我的书说:
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不仅仅包含一个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
解决方法:
该书准确地反映了该标准的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-seqoptreturn
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或double-bracketed属性.不是变量声明.
n3485草案,随后发布了C11(即它正在向C 1y进行的工作),包含相同的措辞.我不知道在某些草案中是否有一个不同于n3290的规则.