“使用”推导的std :: function和function type不具有相同的类型

时间:2019-02-21 09:43:56

标签: c++ templates template-meta-programming std-function type-deduction

这是一个小例子,用来说明两种不同的函数类型的区别:

#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 :(得分:2)

  

这两种类型似乎是等效的。它们有什么不同?

嗯...不:它们是不同的类型。

如果查看std::function's page in 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 //  ^^^^^^^^^^^^^^...................^