"decltype(&ordenary_func)"和"decltype"(ordenary_func)之间的区别



给定声明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 -tvoid (*)(_IO_FILE*)

echo "FvP8_IO_FILEE" | c++filt -tvoid (_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比较函数指针。

相关内容

  • 没有找到相关文章

最新更新