重複の可能性:
戻り値の型は関数シグネチャの一部ですか?
関連するが接線的な質問 (戻り値の型だけが異なる関数テンプレートを明確にする方法は? ) のフォローアップとして、関数の戻り値の型が署名の一部と見なされないという事実に関連する質問をしたいと思います。関数の。
次のコードを検討してください。
#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
成功するはずです。
ただし、キャストは成功しません。理屈のどこがおかしい?関数シグネチャが原因でキャストが失敗できない場合、キャストが失敗するのはなぜですか?