gpt4 book ai didi

c++ - 为什么推导 F 时 std::is_function 返回 false_type?

转载 作者:太空宇宙 更新时间:2023-11-04 11:22:53 25 4
gpt4 key购买 nike

给定以下代码,其中类型 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在这两种情况下,可惜它不是。

最佳答案

你有你可以使用的类型的额外引用 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

关于c++ - 为什么推导 F 时 std::is_function<F> 返回 false_type?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27666255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com