C++ 谜题:逃避typeid的检查
我偶然提出了一个很好的面试问题C++ 谜题:逃避typeid的检查,c++,typeid,C++,Typeid,我偶然提出了一个很好的面试问题 模板 布尔福(T obj) { if(typeid(T)=typeid(obj)) 返回false; 返回true;//#包括 结构B{virtual~B(){}; int main() { 结构:B{}x; 断言(foo(x)); } 操作是。int main() { typedef char C[1]; foo(0);//返回true; } 请参阅了解此答案的解释和此问题的根源。这不是更好的位置吗?不建议不允许(没有为此标记).喜欢这个问题。我只是想知道。
模板
布尔福(T obj)
{
if(typeid(T)=typeid(obj))
返回false;
返回true;//#包括
结构B{virtual~B(){};
int main()
{
结构:B{}x;
断言(foo(x));
}
操作是。int main()
{
typedef char C[1];
foo(0);//返回true;
}
请参阅了解此答案的解释和此问题的根源。这不是更好的位置吗?不建议不允许(没有为此标记).喜欢这个问题。我只是想知道。@Bart,不管怎样,我已经给出了答案。@Alexandre,+1很好,但我没有提到运行时多态性部分。我期待着不同的结果answer@iammilind:您期望什么?typeid(T)
将在编译时解析,如果T
已知,以及typeid(obj)
如果obj
不是多态的(将使用其静态类型)。请你解释一下好吗?@Dante:当然,你不明白哪一部分?@Dante Jiang:typeid
仅在应用于引用类型时才会返回多态类型信息。如果我将B&
替换为B
,那么1)x
在传递到foo
时将被切分,从而将其转换为实际值<如果obj
不是引用类型(在本例中,T
),那么typeid(obj)
将返回obj
的静态类型。很好。一行foo(0)
也可以。我认为foo(“abc”)
是一种更有用的方式来传达发生在s.O.读者身上的事情……一次一个怪癖;-)。
template<typename T>
bool foo (T obj)
{
if(typeid(T) == typeid(obj))
return false;
return true; // <-- execute this
}
#include <cassert>
struct B { virtual ~B() {} };
int main()
{
struct : B {} x;
assert(foo<B&>(x));
}
int main ()
{
typedef char C[1];
foo<C>(0); // returns true;
}