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
。