Ответ 1
Это известная ошибка. Компилятор примет код, если вместо этого используется тип возвращаемого возврата.
struct C
{
std::vector<int> v;
auto begin() -> decltype(v.begin()) { return v.begin(); }
auto end() -> decltype(v.end()) { return v.end(); }
};
Как говорится в отчете об ошибке, еще одна работа:
struct C
{
std::vector<int> v;
decltype(std::declval<decltype(v)>().begin()) begin() { return v.begin(); }
decltype(std::declval<decltype(v)>().end()) end() { return v.end(); }
};
Но поскольку @BenVoigt указывает в комментариях, прочитайте этот ответ, почему предпочтительным вариантом является возвращаемый тип возврата.