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

sme*_*lin 5 c++

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

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

template <class T>
class Foo
{
    static_assert(typeid(T)==typeid(Bar) || typeid(T)==typeid(FooBar));
};
Run Code Online (Sandbox Code Playgroud)

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

Unc*_*ens 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>();
}
Run Code Online (Sandbox Code Playgroud)

哪里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;
};
Run Code Online (Sandbox Code Playgroud)

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


Jas*_*rff 5

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

显然在2008年,C++标准委员会有一些typeid表达式,例如你的例子中的表达式表现为常量表达式,就像sizeof.但是,根据这一评论,这一变化最终还是归还了.