C++ “decltype(&ordenary_func)`和decltype`(ordenary_func)之间的区别`
给定声明void close_file_funcstd::file*fd{},我发现decltype&close_file_func是void*_IO_file*的类型,而decltypeclose_file_func是void _IO_file*的类型 你可以查看相关的代码 为了您的方便,我在下面发布了代码和执行输出C++ “decltype(&ordenary_func)`和decltype`(ordenary_func)之间的区别`,c++,c++11,function-pointers,implicit-conversion,decltype,C++,C++11,Function Pointers,Implicit Conversion,Decltype,给定声明void close_file_funcstd::file*fd{},我发现decltype&close_file_func是void*_IO_file*的类型,而decltypeclose_file_func是void _IO_file*的类型 你可以查看相关的代码 为了您的方便,我在下面发布了代码和执行输出 #include<iostream> #include<typeinfo> void close_file_func(std::FILE* fd);
#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_文件| c++过滤器-t表示无效_IO_文件*
这个表达式td::cout您可能认为这两个表达式应该给出与函数指针相同的类型。是,可能在某些上下文1中执行,但不适用于decltypeclose\u file\u func和typeidclose\u file\u func 与实体一起使用时,将产生实体的类型;因此,decltypeclose\u file\u func精确地生成函数类型,即void\u IO\u file* 1如果参数是未授权的id表达式或未授权的类成员访问表达式,则decltype将生成此表达式命名的实体类型 另一方面&close\u file\u func获取函数的地址并返回函数指针,然后decltype&close\u file\u func生成函数指针类型,即void*\u IO\u file* 1对于 重点矿山 在所有情况下,对于内置操作员,lhs和rhs必须具有 算术或枚举类型请参见下面的算术比较运算符 指针类型请参见下面的指针比较运算符 将左值应用到右值后,将数组应用到指针,然后 函数到指针的标准转换
函数到指针的隐式转换是在左操作数上执行的,因此close_file_func==&close_file_func正在比较函数指针。您可能会认为两者的类型应与函数指针的类型相同。是,可能在某些上下文1中执行,但不适用于decltypeclose\u file\u func和typeidclose\u file\u func 与实体一起使用时,将产生实体的类型;因此,decltypeclose\u file\u func精确地生成函数类型,即void\u IO\u file* 1如果参数是未授权的id表达式或未授权的类成员访问表达式,则decltype将生成此表达式命名的实体类型 另一方面&close\u file\u func获取函数的地址并返回函数指针,然后decltype&close\u file\u func生成函数指针类型,即void*\u IO\u file* 1对于 重点矿山 在所有情况下,对于内置操作员,lhs和rhs必须具有 算术或枚举类型请参见下面的算术比较运算符 指针类型请参见下面的指针比较运算符 将左值应用到右值后,将数组应用到指针,然后 函数到指针的标准转换
函数到指针的隐式转换是在左操作数上执行的,因此close_file_func==&close_file_func正在比较函数指针。如果我理解正确,void_IO_file*是函数的类型,而void*fp_IO_file*是函数指针的类型?我说得对。@sunshilong369是的。谢谢你的澄清。还有一个问题提出,为什么在这种情况下执行表达式td::cout@sunshilong369函数到指针的隐式转换。decltypeclose_file_func不会发生这种情况。只是为了好玩,请尝试decltypeclose_file_func如果我理解正确,void_IO_file*是函数的类型,而void*fp_IO_file*是函数指针的类型?我说得对。@sunshilong369是的。谢谢你的澄清。还有一个问题提出,为什么在这种情况下执行表达式td::cout@sunshilong369函数到指针的隐式转换。decltypeclose\u file\u func不会出现这种情况。只是为了好玩,请尝试decltypeclose\u file\u func有一种比typeid+c++filt更简单的打印类型的方法。请参阅类型static\u assertstd::is\u same::value,void@Jarod42很高兴再次见到你。非常感谢。但是我想不起来。你能帮我一个忙吗?有一种比typeid+c++filt更简单的打印方式。请参阅类型static\u assertstd::is\u same::value,void@Jarod42很高兴再次见到你。非常感谢。但是我想不起来。你能帮我一个忙吗?