据我所知,对于с++
(由于历史原因)中的功能,以下身份是正确的:
foo == &foo;
Tobish 指向函数的指针与函数相同,反之亦然。但是,这些值有不同的类型:
std::is_same<decltype(foo), decltype(&foo)>::value == false;
为什么种类不同?它们是什么?
据我所知,对于с++
(由于历史原因)中的功能,以下身份是正确的:
foo == &foo;
Tobish 指向函数的指针与函数相同,反之亦然。但是,这些值有不同的类型:
std::is_same<decltype(foo), decltype(&foo)>::value == false;
为什么种类不同?它们是什么?
函数的类型和指向函数的指针确实是完全不同的。然而,“函数”值在 C 和 C++ 表达式中的行为与“数组”值的行为非常相似:在许多上下文中,在表达式中,类型“函数”本身的值,无需您的任何输入, 被隐式转换(“衰减”)为“函数指针”类型的值。
您与操作员
==
的示例只是这种上下文的一个示例。形式上,您在左侧有一个函数,在右侧有一个函数指针,您使用 operator 接收到&
。但实际上,==
左操作数“到达”运算符已经转换为“函数指针”类型。由于上述隐式转换,该指针“得到了自己”。以完全相同的方式,对于数组
int a[10]
,等式尽管这个等式左边和右边的原始类型是完全不同的。
对于函数的情况,等式也成立
等等
在诸如一元运算符
&
、运算符sizeof
、说明符decltype
等上下文中,没有隐式转换。因此,在这些上下文中,您会看到函数的真实、未转换类型。(数组也是如此)。以上适用于表达式中“函数”类型值的行为。“函数”类型本身在声明中的行为是一个完全不同的独立故事。在声明中,“函数”类型几乎总是保持“函数”类型。
例如,广告
是不正确的。
decltype(foo)
看到类型'function',导致标识符a
被声明为类型'function'。该函数不能“初始化”。同时,根据行为准则
decltype
,在此发布公告完全正确 - 它声明
b
为函数指针变量。由于里面的“额外”括号decltype
,“函数”类型值有时间隐式转换为“指针”类型值,并且decltype
看到的不是“函数”类型,而是“指向函数的指针”类型。