特性。テンプレート引数に渡された型、定数によって動作を切り替える。 例えば、shared_ptr< T >でvoidを渡すと、 shared_ptr< void > p; operator*()の戻り値の型がvoid&になるのでコンパイルエラーになってしまいます。 template < typename T > class shared_ptr { ... T& operator*()const{ return *ptr; } ... }; Tがvoid以外→T& Tがvoid→void のように、Tの型によって戻り値の型を選択したいわけです。 ちなみにtemplate内の関数の{...}は呼び出し処理を書かない限りコンパイルされないので、voidでreturnを記述していてもコンパイルエラーになりません。 では、さっそくoperator*()の戻り値の型を決定するための特性クラスを作って