为什么typeid不像sizeof那样编译时常量

时间:2009-12-30 17:41:58

标签: c++

为什么typeid(someType)不像sizeof(someType)那样是常量?

这个问题出现了,因为最近我尝试了类似的事情:

template <class T>
class Foo
{
    static_assert(typeid(T)==typeid(Bar) || typeid(T)==typeid(FooBar));
};

我很好奇为什么编译器在编译时知道类型(sizeof)的大小,而不是类型本身(typeid)

5 个答案:

答案 0 :(得分:10)

当你处理类型时,你宁愿使用简单的元编程技术:

#include <type_traits>

template <class T>
void Foo()
{
    static_assert((std::is_same<T, int>::value || std::is_same<T, double>::value));
}

int main()
{
    Foo<int>();
    Foo<float>();
}

其中is_same可以像这样实现:

template <class A, class B>
struct is_same
{
    static const bool value = false;
};

template <class A>
struct is_same<A, A>
{
    static const bool value = true;
};

typeid可能不是编译时,因为它必须处理运行时多态对象,而这就是你宁愿使用它的地方(如果有的话)。

答案 1 :(得分:5)

C ++可以处理某些类型的常量(编译时)表达式,但引用类型不属于这些类型。 typeid表达式的结果是对std::type_info对象的引用。

显然在2008年,C ++标准委员会有typeid个表达式,例如你的示例中的表达式表现为常量表达式,就像sizeof一样。然而,根据this comment,这种变化最终还是已经恢复了。

答案 2 :(得分:2)

因为typeid需要RTTI,即typeid在运行时执行,BOOST_STATIC_ASSERT在编译时执行。

更多信息here

答案 3 :(得分:1)

因为typeid可以灵活地根据指针或对象的引用在运行时进行查找,所以它不能返回编译时常量。即使看起来它可以。 sizeof没有这样的限制,因为它总是在编译时进行计算。

答案 4 :(得分:0)

它在编译时知道类型本身(用它自己的内部语言),但不知道它的类型id(显然是为运行时创建的)。