zxc さんが書きました: それよりも個人的に気になるのは
YuO さんが書きました:上記より,nameは型によらず同じ文字列や空文字列を返す実装も許されます。
ここです。
型によらないものを返す可能性があるなら、これらを信用し実行時の型情報を利用したプログラムを組むことは、あまり望ましいことではないように思えますが、そういうことではないのでしょうか。もしくはtypeidやname関数の実装として、返す文字列が型ユニークであることを保障しているわけではない、ということなのでしょうか。
typeidは型を同定できるstd::type_infoを返します。
このtype_info自体は実行時の型情報として利用できます。
std::type_info::name()は,型によって情報が異なることを規格は保証していません。
このため,type_info::name()を型情報として扱うことができるかは処理系に依存します。
ただし,type_info::name()の戻り値はimplementation-definedなので,実装には文書化する義務があります。
例えば,VC++であれば,
type_info Classに,
The type_info::name member function returns a const char* to a null-terminated string representing the human-readable name of the type.
とありますし,GCCであれば,
The GNU C++ Library /
Part I. Introduction /
Chapter 1. Statusに,
[18.5.1]/7 The return value of std::type_info::name() is the mangled type name (see the previous entry for more).
とあります。
これらの処理系であれば,type_info::name()を型情報として扱うことができるでしょう。
ただ,type_info::name()の比較は文字列になるため,type_infoを==や!=で比較した方が移植性もあり,速度も速いでしょう。
そういう意味では,type_info::name()を実行時の型情報として必要になることはないと思われます。
type_info::name()はぼずおさんが書かれているようにデバッグ時の表示目的と割り切った方がよいでしょう。
# 関数に入ったときの引数の型をデバッグ表示する,等。