C++ typeid(T)是在运行时还是编译时被计算的?

C++ typeid(T)是在运行时还是编译时被计算的?,c++,templates,rtti,C++,Templates,Rtti,我在任何地方都找不到这个看似简单的问题的答案 下面的C++函数使用RTTI吗?当然不必,但我想知道是否可以保证typeid将在编译时确定 template <typename T> const char *getName() { return typeid(T).name(); // Resolved at compile time? } 模板 常量字符*getName() { 返回typeid(T).name();//是否在编译时解析? } 正如我在评论中提到的,关于t

我在任何地方都找不到这个看似简单的问题的答案

下面的C++函数使用RTTI吗?当然不必,但我想知道是否可以保证typeid将在编译时确定

template <typename T>
const char *getName()
{
   return typeid(T).name();   // Resolved at compile time?
}
模板
常量字符*getName()
{
返回typeid(T).name();//是否在编译时解析?
}

正如我在评论中提到的,关于
typeid()
的“注释”部分说:

当应用于多态类型的表达式时,typeid表达式的计算可能涉及运行时开销(虚拟表查找),否则typeid表达式将在编译时解析

template <typename T>
const char *getName()
{
   return typeid(T).name();   // Resolved at compile time?
}

由于
typeid
应用于类型而不是对象,因此没有运行时类型信息,因此开销不会成为问题

另一方面:据我所知,该标准对何时确定值没有任何要求,因此不能保证没有运行时开销


编辑:
当然,(可能)没有担保并不意味着这不是一个合理的假设。

我无法想象有人会编写一个编译器在编译时不计算
typeid(t)

它会在什么对象上使用RTTI?@someone\u smiley:如果编译器不知道
t
是什么,它将如何生成正确的专门化?cpp参考上的“注释”部分说():当应用于多态类型的表达式时,typeid表达式的计算可能涉及运行时开销(虚拟表查找),否则typeid表达式将在编译时解析。“@CharlesBailey:T必须在编译时知道,否则程序无法编译。@Watusimoto:如果你知道,那么我就不明白你在问什么问题。在这个例子中,
T
是一个类型,而不是一个表达式。@molbdnio所以表达式
typeid(T)
在编译时被解析。(编译器可能仍然会在其上生成对
std::type_info::name
的调用。)@JamesKanze为我没有阅读整个句子感到羞愧。。。我仍然无法在标准中找到任何有关编译时分辨率的参考资料。@molbdnilo我认为这就是他引用的内容。你是对的;该标准没有做出任何保证(尽管很难看出当您将
typeid
与类型名称一起使用时,情况会如何)。不过,这是他的来源中的一个错误。
template <typename T>
const char *getName()
{
   return typeid(T).name();   // Resolved at compile time?
}