jro*_*rok 4 c++ lambda compiler-warnings c++11
考虑这个例子:
#include <algorithm>
#include <iostream>
int main()
{
std::string str = "abcde4fghijk4l5mnopqrs6t8uvwxyz";
std::string str2;
std::remove_copy_if(str.begin(), str.end(),
std::back_inserter(str2),
[](char& c) {
if (std::isdigit(c))
return true; // <----- warning here
else
return false;
}
);
std::cout << str2 << '\n';
}
Run Code Online (Sandbox Code Playgroud)
使用GCC 4.6.1,这可以很好地编译并打印预期的输出(字母表)但是我得到一个警告说"只有在return语句是函数体中唯一的语句时才能推断出lambda返回类型".
现在,我知道如何摆脱警告(使用尾随返回类型或只是说return isdigit(c);),但我很好奇,因为编译器没有任何警告(或者它应该是):代码中可能出错的地方像这样?标准是否对此有所说明?
正如@ildjarn在评论中所说的那样,根据标准,你的代码根本就是不正确的.
§5.1.2 [expr.prim.lambda] p4
[...]如果lambda表达式不包含trailing-return-type,则就好像trailing-return-type表示以下类型:
- 如果compound-statement的格式为
{attribute-specifier-seq optreturnexpression ;}
lvalue-to-rvalue转换(4.1),数组到指针转换(4.2)和函数到指针转换(4.3)之后返回表达式的类型;- 否则,
void.[...]
就是这样,基本上如果大括号内的代码(在标准中称为compund-statement)是什么,但return some_expr;标准说返回类型是不可约的,你得到一个void返回类型.
| 归档时间: |
|
| 查看次数: |
690 次 |
| 最近记录: |