给定声明void close_file_func(std::FILE* fd){}
,我发现decltype(&close_file_func)
是void (*)(_IO_FILE*)
的类型,而decltype(close_file_func)
是void (_IO_FILE*)
的类型?
您可以通过 https://godbolt.org/z/QK5q3o 检查相关的代码。
为了您的方便,我在下面发布了代码和执行输出。
#include<iostream>
#include<typeinfo>
void close_file_func(std::FILE* fd);
int main()
{
std::cout << typeid(close_file_func).name() << std::endl;
std::cout << typeid(&close_file_func).name() << std::endl;
}
//Terminate outputs:
//FvP8_IO_FILEE
//PFvP8_IO_FILEE
echo 'PFvP8_IO_FILEE' | c++filt -t
说void (*)(_IO_FILE*)
,
echo "FvP8_IO_FILEE" | c++filt -t
说void (_IO_FILE*)
.
而这个表达(std::cout << (close_file_func == &close_file_func) << std::endl;
(是合法的。你看,close_file_func == &close_file_func
返回true
.
我想了一遍又一遍,但我仍然无法理解。如果能就此问题提供任何提示,我将不胜感激。
您可能认为两者都应该提供与函数指针相同的类型。是的,函数到指针的隐式转换可能在某些上下文1中执行,但不适用于decltype(close_file_func)
(和typeid(close_file_func)
(。
当与实体一起使用时,decltype
将产生实体的类型;因此decltype(close_file_func)
完全产生函数类型,即void (_IO_FILE*)
.
1( 如果参数是无括号的 id 表达式或无括号的类成员访问表达式,则 decltype 将生成此表达式命名的实体的类型。
另一方面,&close_file_func
获取函数的地址并返回函数指针,然后decltype(&close_file_func)
产生函数指针类型,即void (*)(_IO_FILE*)
.
1对于operator==
,
(强调我的(
在所有情况下,对于内置运算符,lhs 和 rhs 必须具有
- 算术或枚举类型(请参阅下面的算术比较运算符(
指针- 类型(请参阅下面的指针比较运算符(
在应用左值到rvalue,数组到指针和之后函数到指针的标准转换。
函数到指针的隐式转换在左侧操作数上执行,因此close_file_func == &close_file_func
比较函数指针。