![](/img/trans.png)
[英]Why is the sizeof expression not a compile-time constant like 2, 4, 8, etc.?
[英]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.