由“using”推导出的std :: function和function type没有相同的类型

问题描述 投票:0回答:1

这是一个小例子,显示两个不同的函数类型的区别:

#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,这让我很困惑。这两种类型似乎都是等同的。他们有什么不同?

c++ templates template-meta-programming std-function type-deduction
1个回答
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 //  ^^^^^^^^^^^^^^...................^
© www.soinside.com 2019 - 2024. All rights reserved.