Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “decltype(&ordenary_func)`和decltype`(ordenary_func)之间的区别`_C++_C++11_Function Pointers_Implicit Conversion_Decltype - Fatal编程技术网

C++ “decltype(&ordenary_func)`和decltype`(ordenary_func)之间的区别`

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);

给定声明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);

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很高兴再次见到你。非常感谢。但是我想不起来。你能帮我一个忙吗?