Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

typeid() returns extra characters in g++

class foo
{
public:
  void say_type_name()
  {
    std::cout << typeid(this).name() << std::endl;
  }
};

int main()
{
  foo f;;
  f.say_type_name();
}

Above code prints P3foo on my ubuntu machine with g++. I am not getting why it is printing P3foo instead of just foo. If I change the code like

    std::cout << typeid(*this).name() << std::endl;

it prints 3foo.

Any thoughts?

like image 758
Navaneeth K N Avatar asked Apr 25 '09 17:04

Navaneeth K N


People also ask

What is the return type of Typeid?

The typeid operator returns an lvalue of type const std::type_info that represents the type of expression expr. You must include the standard template library header <typeinfo> to use the typeid operator. Classes A and B are polymorphic; classes C and D are not.

What does Typeid name return C++?

typeid( object ); The typeid operator is used to determine the class of an object at runtime. It returns a reference to a std::type_info object, which exists until the end of the program, that describes the "object".

Is Typeid a keyword in C++?

The typeid keyword is a unary operator that yields run-time type information about its operand if the operand's type is a polymorphic class type. It returns an lvalue of type const std::type_info .

What is Typeinfo C++?

The class type_info holds implementation-specific information about a type, including the name of the type and means to compare two types for equality or collating order. This is the class returned by the typeid operator. The type_info class is neither CopyConstructible nor CopyAssignable.


2 Answers

Because it is a pointer to foo. And foo has 3 characters. So it becomes P3foo. The other one has type foo, so it becomes 3foo. Note that the text is implementation dependent, and in this case GCC just gives you the internal, mangled name.

Enter that mangled name into the program c++filt to get the unmangled name:

$ c++filt -t P3foo
foo*
like image 176
Johannes Schaub - litb Avatar answered Sep 20 '22 12:09

Johannes Schaub - litb


std::type_info::name() returns an implementation specific name. AFAIK, there is no portable way to get a "nice" name, although GCC has one. Look at abi::__cxa_demangle().

int status;
char *realname = abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status);
std::cout << realname;
free(realname);
like image 21
Ilia K. Avatar answered Sep 21 '22 12:09

Ilia K.