Каков срок жизни объекта, возвращаемого оператором typeid? - PullRequest
5 голосов
/ 11 августа 2011

Если я позвоню typeid и получу адрес вернувшегося type_info:

const type_info* info = &( typeid( Something ) );

каков срок жизни объекта, возвращаемого typeid и как долго указатель на этот объект будет оставаться действительным?

Ответы [ 3 ]

10 голосов
/ 11 августа 2011

Однако реализация их реализует, результаты выражений typeid являются lvalues, и время жизни объектов, на которые ссылаются эти lvalue, должно длиться до конца программы.

Из ИСО / МЭК 14882:2003 5.2.8 [expr.typeid]:

Результатом выражения typeid является lvalue [...] Время жизни объекта, на который ссылается lvalue, продолжается до концапрограмма.

5 голосов
/ 11 августа 2011

Начиная с 5.2.8.1 стандарта C ++ 2003:

Результатом выражения typeid является lvalue статического типа const std :: type_info (18.5.1) и динамического типа const std ::type_info или const name, где name является классом, определяемым реализацией, производным от std :: type_info, который сохраняет поведение, описанное в 18.5.1.61) Время жизни объекта, на которое ссылается lvalue, продолжается до концапрограмма .То, вызывается ли деструктор для объекта type_info в конце программы, не указано.

2 голосов
/ 11 августа 2011

Его время жизни - это продолжительность программы. И независимо от того, сколько раз вы пишете typeid(x), он будет каждый раз возвращать один и тот же объект type_info для одного и того же типа.

То есть

 T x, y;
 const type_info & xinfo = typeid(x);
 const type_info & yinfo = typeid(y);

Ссылки xinfo и yinfo обе ссылаются на один и тот же объект. Поэтому попробуйте напечатать адрес, чтобы проверить это:

 cout << &xinfo << endl; //printing the address
 cout << &yinfo << endl; //printing the address

Выход:

0x80489c0
0x80489c0

Примечание: для вашего прогона адрес может отличаться от указанного выше, но как бы то ни было, он будет таким же!

Демо: http://www.ideone.com/jO4CO

...