Чтобы быть более конкретным, предположим, что я пишу template<class Pointer> class Foo, и я хочу объявить typedef внутри класса для типа, который *p имел бы, если p имел тип Pointer.
В С++ 03, насколько мне известно, единственный способ сделать это - что-то вроде
typename std::iterator_traits<Pointer>::reference
Недостатком этого метода является то, что он не будет работать, если Pointer - это какой-то пользовательский тип итератора, и автор забыл расширить std::iterator или иначе определить специализацию std::iterator_traits.
В С++ 11 мой коллега предложил
decltype(*Pointer())
Но это не сработает, если Pointer не является конструктивным по умолчанию, поэтому он изменил это на
decltype(**(Pointer*)0)
Я пробовал это, и это сработало, но потом я подумал, что это выглядит немного, потому что оно связано с разыменованием нулевого указателя и, следовательно, может быть не совместимо со стандартами.
Можем ли мы сделать лучше?