可能重复:
返回类型是函数签名的一部分吗?
跟进一个相关但切题的问题(如何消除仅因返回类型不同而不同的函数模板?),我想问一个与函数的返回类型不被认为是签名的一部分有关的问题的一个功能。
考虑以下代码:
#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
}
上面提到的代码行会导致编译错误,因为要转换为的函数类型的返回类型与函数的返回类型foo
不匹配。foo
但是我认为函数的返回类型在函数的签名中不起作用!
按照某种思路,既然函数签名long(&)()
与 的签名匹配foo
,那么foo
对这种类型的函数的强制转换应该会成功。
然而,演员没有成功。推理哪里出错了?如果由于函数签名而强制转换不能失败,那么为什么强制转换失败?