Справочный параметр Const в лямбда-функции - PullRequest
3 голосов
/ 12 марта 2020
#include <iostream>
#include <functional>

using Callback = std::function<void(const int)>;

int main() {
    Callback testCall = [](const int &num) {
        std::cout << "callback: " << num << " - " << &num << std::endl;
    };
    int num = 42;
    testCall(num);
    std::cout << "main:     " << num << " - " << &num << std::endl;
}

Возможный вывод:

callback: 42 - 000000B19197F618
main:     42 - 000000B19197F694

Как видите, даже если я назначаю лямбда-функцию, которая принимает параметр по ссылке, она все равно использует копию.

правильно?

Если да, то почему он все еще компилируется? Почему, по крайней мере, нет предупреждения о несоответствии между параметрами объявления Callback и назначенной лямбдой. (const int &num против const int num)

Когда не используется const, он не компилируется.

PS. если вы найдете более подходящее название, не стесняйтесь редактировать.

1 Ответ

2 голосов
/ 12 марта 2020

Это потому, что testCall - это объект-функтор, который перехватывает свой параметр при копировании, а затем вызывает лямбду для него.

Try:

Callback f = [](const int &num) {
        std::cout << "callback: " << num << " - " << &num << std::endl;
};

int main() {
        int num = 999;
        std::cout << "callback: " << num << " - " << &num << std::endl;
        f(num);
        [](const int &num) {
                std::cout << "callback: " << num << " - " << &num << std::endl;
        }(num);
}

вы увидите что-то вроде:

callback: 999 - 0x7ffeed60a9bc
callback: 999 - 0x7ffeed60a994
callback: 999 - 0x7ffeed60a9bc    

, что означает, что callBack не сама функция, а косвенная функция. И нет проблем с типами ...

Ответ на этот вопрос поможет вам понять, что происходит под капотом: Как работает std :: function

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...