难道我真的认为这个功能应该只在编译时进行评估,或者是有一个运行时间成本呢?
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;
}
难道我真的认为这个功能应该只在编译时进行评估,或者是有一个运行时间成本呢?
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;
}
constexpr功能允许在编译时要评估的功能,但不要求,所以你的回答是“也许”。 这取决于编译器的优化设置。
§7.1.5[dcl.constexpr] / 7
到的呼叫
constexpr
函数产生相同的结果为等效的非呼叫constexpr
不同之处在于所涉及的呼叫在所有方面功能constexpr
函数可以在常量表达式出现。
如果你想有没有运行时的成本,你可以通过将其分配到一个constexpr变量,如强制编译时计算
constexpr auto foo = CompID<Foo>();
还要注意的是type_info.hash_code()
无法在编译时进行评估 (它不是一个constexpr函数,§18.7.1[type.info] / 7)。 所以,你的代码其实是错误的。