为什么需要更新范围的等效表示?

sky*_*ack 5 c++ language-lawyer c++11 c++14 c++17

从C++ 11到C++ 17,range-for循环等效于以下代码:

{
    auto && __range = range_expression ; 
    for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin) { 
        range_declaration = *__begin; 
        loop_statement 
    } 
}
Run Code Online (Sandbox Code Playgroud)

从C++ 17开始,等价将(显然)更新为这个:

{
    auto && __range = range_expression ; 
    auto __begin = begin_expr ;
    auto __end = end_expr ;
    for ( ; __begin != __end; ++__begin) { 
        range_declaration = *__begin; 
        loop_statement 
    } 
}
Run Code Online (Sandbox Code Playgroud)

乍一看,我能看到的唯一区别在于,__begin并且__end不再共享类型,只要它们(让我说)可比较.

还有其他原因需要这种改变吗?