繁体   English   中英

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

[英]Why is typeid not compile-time constant like sizeof

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

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

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

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

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

#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可能不是编译时,因为它必须处理运行时多态对象,而这就是你宁愿使用它的地方(如果有的话)。

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

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

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

更多信息在这里

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM