C++ 17 में 'लूप स्पेसिफिकेशन' के लिए 'रेंज आधारित' क्यों बदल गया?




for-loop language-lawyer (2)

इस सवाल का पहले से ही यहाँ एक जवाब है:

मैं कुछ बदसूरत कोड देख रहा था (जो पुनरावृत्ति करते समय अंतर्निहित अनुक्रम को संशोधित कर रहा था), और लूप के for रेंज-आधारित की परिभाषा का पता लगाने के for , मैं cppreference

वहाँ मैंने कुछ अजीब देखा:

लूप के for आधारित सीमा C ++ 17 में बदल गई है, लेकिन मुझे परिवर्तन का कारण नहीं दिखता है, और कोड मुझे (केवल "रिफैक्टर्ड") समान दिखता है। तो पुराना एक था:

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

नया है

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

यह परिवर्तन क्यों किया गया था, और क्या यह कोई कानूनी C ++ 14 कार्यक्रम C ++ 17 में अपरिभाषित व्यवहार ( UB ) प्रदर्शित करता है?


इसे बाद में "नोट्स" में समझाया गया है:

C ++ 17 के अनुसार, start_expr और end_expr के प्रकार समान नहीं होने चाहिए ...

और आपके पास ऐसा नहीं हो सकता है:

auto __begin = begin_expr, __end = end_expr;

का उपयोग करते हुए

auto __begin = begin_expr, __end = end_expr;

एक ही प्रकार को वापस करने के लिए begin_expr और end_expr दोनों की आवश्यकता होती है। इसका अर्थ है कि आपके पास एक प्रहरी iterator प्रकार नहीं हो सकता है जो आरंभिक प्रकार से भिन्न हो। का उपयोग करते हुए

auto __begin = begin_expr ;
auto __end = end_expr ;

C ++ 14 के साथ पूर्ण पश्चगामी संगतता साबित करते हुए उस समस्या को हल करता है।





c++17