Почему нет ошибки компиляции при преобразовании в std :: function - PullRequest
0 голосов
/ 10 декабря 2018

Почему строки с p1 и p2 компилируются нормально?

Они имеют разные типы

#include <functional> 
#include <iostream>


void cb(int X)
{
    std::cout << X << "\n";
}

int main(void) {

 std::function<void(void)> p1 = std::bind(cb, 9);
 std::function<void(int)>  p2 = std::bind(cb, 5);    

 //p1 = p2;
}

Если я раскомментирую строку p1 = p2 - ошибка компиляции

1 Ответ

0 голосов
/ 10 декабря 2018

Функциональный объект, созданный вызовом std::bind, игнорирует все дополнительные аргументы.Пример:

void f(int);

int main() {
    auto a = std::bind(f, 42);
    a();
    a(1);
    a(1, 2, 3);
}

Вы можете присвоить такой объект std::function, используя то же или большее количество аргументов.Опять же, дополнительные аргументы будут игнорироваться.

C ++ 11 лямбда-выражения более эффективны, а дополнительные аргументы вызывают ошибку компилятора (например, try auto a = []() { f(42); };).

...