为什么std :: is_function <f>在推导出F时会返回false_type?</f>

时间:2014-12-27 10:13:16

标签: c++ templates typetraits type-deduction

鉴于以下代码,自动推导出类型Function,当我断言Function是否是使用std::is_function<Function>的函数时,我得到了意外的结果:

#include <iostream>
#include <iomanip>
#include <type_traits>

template <typename Function>
bool test_type(Function&& f)
{
    return std::is_function<Function>::value;  
}

template <typename Function>
bool test_decltype(Function&& f)
{
    return std::is_function<decltype(f)>::value;
}

int f()
{
    return 1;
}

int main()
{
    std::cout << std::boolalpha
        << "is_function<Function>:    " << test_type(f) << std::endl
        << "is_function<decltype(f)>: " << test_decltype(f) << std::endl
        << std::endl
        << "Explicit type:" << std::endl
        << "is_function<Function>:    " << test_type<int()>(f) << std::endl
        << "is_function<decltype(f)>: " << test_decltype<int()>(f) << std::endl;

    return 0;
}

但结果是(此处:http://ideone.com/Jy1sFA,使用MSVC2013.4在本地验证):

is_function<Function>:    false
is_function<decltype(f)>: false

Explicit type:
is_function<Function>:    true
is_function<decltype(f)>: false

即使在推断的案例中,我预计is_function<Function>也会true_type。说实话,我甚至期望is_function<decltype(f)>在这两种情况下都是true_type,但实际上并非如此。

1 个答案:

答案 0 :(得分:1)

您可以使用std::remove_reference

的类型的额外参考
template <typename Function>
bool test_type(Function&& f)
{
    return std::is_function<typename std::remove_reference<Function>::type>::value;
}

template <typename Function>
bool test_decltype(Function&& f)
{
    return std::is_function<typename std::remove_reference<decltype(f)>::type>::value;
}

Live example