constexpr和RTTI

use*_*108 3 constexpr c++11

我想做这样的事情:

template <typename T>
constexpr ::std::size_t type_name_hash()
{
  return ::std::hash<::std::string>()(typeid(T).name());
}
Run Code Online (Sandbox Code Playgroud)

现在,我既不知道hash也不stringconstexpr,但是这可能是周围的工作,承担他们constexpr.我想问的是,如果RTTI打开,constexpr计算哈希值的函数是否typeid(T).name()还会产生编译时常量?什么时候RTTI 关闭?

Arn*_*gel 5

typeid(type-id)和typeid(expr)都可以在常量表达式中使用,除非(如前所述)expr的结果是多态类类型的glvalue.

但是,由于没有type_info标准成员constexpr(包括hash_code()方法),除了获取其地址外,您无法对该对象执行任何操作.标准中甚至没有保证对象被初始化.即使获取地址也几乎没用,因为当使用相同类型时,无法保证typeid()具有相同的结果.例如,以下断言可能会失败:

static_assert(&typeid(int) == &typeid(int), "Multiple type_infos for int");
Run Code Online (Sandbox Code Playgroud)

这是一个人为的例子,但是在程序中使用的多个共享库中甚至可能在不同的翻译单元中typeid(T)产生不同的结果并不是闻所未闻T.