Это из-за способа синтаксического анализа языка.
decltype(obj)::iterator it = obj.begin();
Вы хотите, чтобы оно стало
(decltype(obj)::iterator) it;
Но на самом деле оно становится
decltype(obj) (::iterator) it;
Я должен признать, я также был удивлен, увидев, что это было так, так как я уверен, что я делал это раньше. Однако в этом случае вы можете просто использовать auto
или даже decltype(obj.begin())
, но, кроме того, вы можете сделать
typedef decltype(obj) objtype;
objtype::iterator it;