【问题标题】:Lambda function throwing error if return type is changed from auto to bool如果返回类型从 auto 更改为 bool,则 Lambda 函数抛出错误
【发布时间】:2020-12-04 02:48:34
【问题描述】:

我在 C++ 中练习 lambda 函数,下面的代码运行良好


void insertionSort(int* a, int size, bool reverse=false) {
    auto comp = [](int a, int b, bool reverse) {
        return reverse ? a > b : b < a;
    };
    
    for (int i = 0; i < size; i++) {
        int current = a[i];
        cout << current <<endl;
        int j = i-1;
        while (j >= 0 && comp(current, a[j], reverse)) {
           a[j+1] = a[j]; //shift right
           j--;
        }
        a[j+1] = current;
    }
    show(a, size); //another function which prints all elements of a
}

但如果我改变了

    auto comp = [](int a, int b, bool reverse) {

    bool comp = [](int a, int b, bool reverse) {

GCC 编译器在编译时抛出以下错误 error: 'comp' cannot be used as a function 29 | while (j &gt;= 0 &amp;&amp; comp(current, a[j], reverse)) {

这是预期的吗?什么是一般规则?我是否应该始终将返回类型指定为auto

【问题讨论】:

  • auto comp = [](int a, int b, bool reverse) -> bool {} 这就是你如何用 bool 返回类型声明 lambda。您要更改的 auto 是 lambda 本身的类型。

标签: c++ c++11 lambda auto


【解决方案1】:

在第一个代码sn-p中,comp的类型是lambda的类型,它是唯一的未命名类类型,(这就是我们使用auto的原因,我们不能明确指定类型)。请注意,它不是 lambda 的返回类型(即bool)。

如果你想明确指定 lambda 的返回类型,你可以

auto comp = [](int a, int b, bool reverse) -> bool {
//                                         ^^^^^^^

顺便说一句:非捕获 lambda 可以转换为函数指针,然后隐式转换为 bool。因此,如果您将comp 的类型更改为bool,其值始终为true。正如错误消息所说,您不能将其用作仿函数。

【讨论】:

【解决方案2】:

当您编写auto comp = [](int a, int b, bool reverse) { 时,comp 具有唯一类型 lambda,即 C++ 编译器创建一个名为 comp 的结构。但是当你写bool comp = [](int a, int b, bool reverse) {时,comp的类型是bool,只能取bool值。

【讨论】:

    猜你喜欢
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2021-03-13
    相关资源
    最近更新 更多