sizeof演算子のオペランドは評価されないので、これを行うことができます:
int f(); //no definition, which means we cannot call it
int main(void) {
printf("%d", sizeof(f()) ); //no linker error
return 0;
}
オンラインデモ:http : //ideone.com/S8e2Y
つまり、関数のみをf使用する場合は、関数を定義する必要はありませんsizeof。この手法は、C ++でもオペランドがsizeof評価されないため、C ++テンプレートのメタプログラミングで主に使用されます。
なぜこれが機能するのですか?これは、sizeof演算子がvalueではなく式のタイプを操作するため機能します。ですから、あなたが書くときsizeof(f())、それは式の型に作用しますf()、そしてそれは関数の戻り型に他なりませんf。関数が実際に実行した場合に関数が返す値に関係なく、戻り値の型は常に同じです。
C ++では、これを行うこともできます。
struct A
{
A(); //no definition, which means we cannot create instance!
int f(); //no definition, which means we cannot call it
};
int main() {
std::cout << sizeof(A().f())<< std::endl;
return 0;
}
しかし、ではsizeof、最初にをA書き込んA()でのインスタンスを作成し、次にをf書き込んA().f()でインスタンスの関数を呼び出しているように見えますが、そのようなことは起こりません。
デモ:http : //ideone.com/egPMi
これは、のその他の興味深いプロパティを説明する別のトピックですsizeof。