C ++ constexpr在编译时

时间:2012-10-08 16:30:28

标签: c++ templates c++11 constexpr

我是否认为此功能只应在编译时进行评估,或者是否需要运行时间费用?

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;
}

1 个答案:

答案 0 :(得分:6)

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)。所以你的代码实际上是错误的。

相关问题