Используя
auto __begin = begin_expr, __end = end_expr;
требует и begin_expr
и end_expr
возвращать тот же тип. Это означает, что у Вас не может быть типа итератора сигнальной метки, который отличается от начинающегося типа. Используя
auto __begin = begin_expr ;
auto __end = end_expr ;
устраняет ту проблему при оказывании полным назад совместимость с C++ 14.
Это объяснено позже в "примечаниях":
С C++ 17, типы begin_expr и end_expr не должны быть тем же...
и у Вас не может быть этого с:
auto __begin = begin_expr, __end = end_expr;