为什么将函数转换为除返回类型之外相同的函数类型失败?

Dan*_*aum 1 c++

可能重复:
返回类型是函数签名的一部分吗?

关注一个相关但相切的问题(如何消除仅由返回类型不同的函数模板?),我想问一个与函数的返回类型不被认为是签名的一部分有关的问题一个功能.

请考虑以下代码:

#include <iostream>

int foo()
{
    return 0;
}

int main()
{
    long n = static_cast<long(&)()>(foo)(); // Error: incorrect return type
    int p = static_cast<int(&)()>(foo)(); // Compiles just fine 
}
Run Code Online (Sandbox Code Playgroud)

的代码行上面提到编译错误的结果,因为该返回功能类型的类型,其foo被强制转换不匹配返回功能的类型foo.

但我认为函数的返回类型在函数的签名中不起作用!

根据某种思路,由于函数签名long(&)()与签名匹配foo,foo对此类函数的强制转换应该成功.

但是,演员阵容没有成功.推理在哪里出错了?如果演员阵容因功能签名而无法失败,那么为什么演员阵容失败?

Mik*_*our 8

你是正确的,返回类型不构成函数的签名.

但是,它确实构成了函数类型的一部分,并且不允许将指针转换为不兼容的函数类型.