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;
}