Вот для чего std::declval
:
decltype(*std::declval<T>()) operator*() { /* ... */ }
Если ваша реализация не предоставляет std::declval
(Visual C ++ 2010 не включает его), вы можете легко написать это самостоятельно:
template <typename T>
typename std::add_rvalue_reference<T>::type declval(); // no definition required
Поскольку T
является типом итератора, вы также можете использовать шаблон std::iterator_traits
, который не требует поддержки C ++ 0x:
typename std::iterator_traits<T>::reference operator*() { /* ... */ }