5

この関数はコンパイル時にのみ評価する必要があると考えるのは正しいですか、それとも実行時のコストがかかりますか?

template <typename T>
size_t constexpr CompID() {
    return typeid(T).hash_code();
}

struct Foo {};

int main(int argc, const char * argv[]) {
    size_t foo = CompID<Foo>();
    return 0;
}
4

1 に答える 1

6

constexpr関数を使用すると、コンパイル時に関数を評価できますが、それは必須ではないため、答えは「たぶん」です。コンパイラの最適化設定によって異なります。

§7.1.5[dcl.constexpr]/7

関数の呼び出しは、関数の呼び出しが定数式に現れる可能性があることを除いて、すべての点でconstexpr同等の非関数の呼び出しと同じ結果を生成します。constexprconstexpr

実行時のコストをかけたくない場合は、constexpr変数に割り当てることで、コンパイル時の評価を強制できます。

constexpr auto foo = CompID<Foo>();

type_info.hash_code() また、コンパイル時に評価できないことにも注意してください(これは、constexpr関数、§18.7.1[type.info] / 7ではありません)。したがって、コードは実際には間違っています。

于 2012-10-08T16:33:22.357 に答える