gpt4 book ai didi

c++ - 为什么 `std::is_function_v` 没有按预期工作?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:41:47 26 4
gpt4 key购买 nike

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

using namespace std;

template<typename T>
bool f(T&& v)
{
return is_function_v<decltype(forward<T>(v))>;
}

int main()
{
cout << boolalpha
<< is_function_v<decltype(setw)>
<< endl;

cout << boolalpha
<< f(setw)
<< endl;

return 0;
}

输出是:(clang 6.0 & gcc 8.0)

>

true

false

但我期望的结果应该是:

>

true

true

为什么 std::is_function_v 没有按预期工作?

最佳答案

您需要删除对 T 的引用。

template<typename T>
bool f(T&& v)
{
return is_function_v<remove_reference_t<decltype(forward<T>(v))>>;
// ~~~~~~~~~~~~~~~~~~
}

setw传给f时,它是一个左值,那么转发引用类型T将被推导为函数的左值引用。对于 std::is_function ,对函数的引用(以及指向函数的指针等)不算作函数类型。


顺便说一句:转发引用类型 T 将被推断为左值引用或右值引用;并且在 std::forward 上使用 decltype 将始终产生引用类型,左值引用或右值引用。

关于c++ - 为什么 `std::is_function_v` 没有按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52250610/

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