考虑这个例子:

#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';
}

使用 GCC 4.6.1,这可以很好地编译并打印预期的输出(字母表),但我收到一条警告说“只有当 return 语句是函数体中的唯一语句时,才能推断出 lambda 返回类型”。

现在,我知道如何摆脱警告(使用尾随返回类型或简单地说 return isdigit(c); ),但我很好奇,因为编译器不会白白警告(或者应该是这样):什么可能出错这样的代码?标准对此有任何说明吗?

最佳答案

正如@ildjarn 在他的评论中所说,根据标准,您的代码格式不正确。
§5.1.2 [expr.prim.lambda] p4


就是这样,基本上如果大括号内的代码(在标准中称为复合语句)不是 return some_expr; ,则标准说返回类型是不可推导的,并且您会得到 void 返回类型。

关于c++ - 编译器警告 : lambda return type cannot be deduced,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8582610/

10-11 22:40
查看更多