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 回答