std :: function и тип функции, выведенные "using", не имеют одинаковый тип - PullRequest
0 голосов
/ 21 февраля 2019

Вот небольшой пример, показывающий разницу между двумя типами функций, которые не одинаковы:

#include <iostream>
#include <functional>
#include <type_traits>

template <typename T>
using BinaryOperator = T(const T&, const T&);

int main() {

    std::cout << std::boolalpha 
              << std::is_same<
                      std::function<int(const int&, const int&)>, 
                      BinaryOperator<int>
                 >::value 
              << std::endl;

    return 0;
}

Это печатает false, что меня смущает.Оба типа кажутся эквивалентными.Чем они отличаются?

1 Ответ

0 голосов
/ 21 февраля 2019

Оба типа кажутся эквивалентными.Чем они отличаются?

Ну ... нет: они разных типов.

Если вы посмотрите на страницу std::function в cppreference.com , вы можете видеть, что std::function - это класс с частичной специализацией (определена только специализация), объявленный следующим образом

template <class>
class function; // undefined

template <class R, class... Args>
class function<R(Args...)>;

Таким образом, ваш BynaryOperator<int> не эквивалентен std::function<int(const int&, const int&)>, ноэквивалентно аргументу шаблона.

Вы можете видеть, что это true

std::is_same<std::function<int(const int&, const int&)>, 
             std::function<BinaryOperator<int>>
>::value //  ^^^^^^^^^^^^^^...................^
...