以下はvs 2010マップの実装から抜粋したものです。このメンバー関数はファイルxtreeにある親クラス_Treeで定義されています。戻り値の型テンプレート(enable_if)は何を禁止しますか?
template<class _Valty>
typename _STD tr1::enable_if<!_STD tr1::is_same<const_iterator,
typename _STD tr1::remove_reference<_Valty>::type>::value,
iterator>::type
insert(const_iterator _Where,
_Valty&& _Val)
{ // try to insert node with value _Val using _Where as a hint
return (_Insert(_Where,
this->_Buynode(_STD forward<_Valty>(_Val))));
}
実は、この関数はiterator insert (iterator position, const value_type& x)で、それの興味深い部分は、その戻り値の型です!どういう意味ですか?私が理解するところでは、value_type(つまり、_Valty)がconst_iteratorと同じ場合、テンプレートのインスタンス化が無効になります。
しかし、const_iteratorのへVALUE_TYPEからの暗黙の変換が存在しないので、このような場合には、これは冗長なように見えます。
私は理解できないものがあると信じています。それは何ですか?戻り値の型テンプレートは何を禁止しますか?