Why did the range based for loop specification change in C++17How to use range-based for() loop with std::map?C++11 reverse range-based for-loopWhy are elementwise additions much faster in separate loops than in a combined loop?Why does changing 0.1f to 0 slow down performance by 10x?Why is my program slow when looping over exactly 8192 elements?How the new range-based for loop in C++17 helps Ranges TS?Moving in range-based loop in generic C++ code?range based for used for primitive typeRange based for in C++17 for custom container or general classes with different begin/end types
Are there any privately owned large commercial airports?
Can I use I2C over 2m cables?
How to temporarily replace Latin characters with Greek
What can I do to avoid potential charges for bribery?
Is there a way to make a Minor key sound "less dark"?
Solve Euler Project #9 only mathematically - Pythagorean triplet
one-liner vs script
How are steel imports supposed to threaten US national security?
Modern warfare theory in a medieval setting
What is the best DIY approach to keeping brake dust off your rims?
How can I retrieve email templates from a sandbox using the Salesforce CLI?
How long should a test wait to assume that the result remains fixed
Can the bass be used instead of drums?
Black Box Decision problem for NFA
Suspicious crontab entry
Why do previous versions of Debian packages vanish in the package repositories? (highly relevant for version-controlled system configuration)
Why is coffee provided during big chess events when it contains a banned substance?
How could "aggressor" pilots fly foreign aircraft without speaking the language?
A demigod among men
What causes standard door hinges to close up to a certain amount automatically?
An employee has low self-confidence, and is performing poorly. How can I help?
What can damage a lich in an antimagic field?
Should a grammatical article be a part of a web link anchor
Print the sequence
Why did the range based for loop specification change in C++17
How to use range-based for() loop with std::map?C++11 reverse range-based for-loopWhy are elementwise additions much faster in separate loops than in a combined loop?Why does changing 0.1f to 0 slow down performance by 10x?Why is my program slow when looping over exactly 8192 elements?How the new range-based for loop in C++17 helps Ranges TS?Moving in range-based loop in generic C++ code?range based for used for primitive typeRange based for in C++17 for custom container or general classes with different begin/end types
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty
margin-bottom:0;
I was looking over some ugly code(that was modifying the underlying sequence while iterating), and to explore the definition of range based for loop I went to cppreference.
There I noticed something strange:
range based for loop changed in C++17, but I do not see the reason for change, and code looks the same to me(just "refactored").
So old one was:
auto && __range = range_expression ;
for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin)
range_declaration = *__begin;
loop_statement
New one is
auto && __range = range_expression ;
auto __begin = begin_expr ;
auto __end = end_expr ;
for ( ; __begin != __end; ++__begin)
range_declaration = *__begin;
loop_statement
My question is: why was this change made, and does it make any legal C++14 programs UB in C++17.
c++ for-loop language-lawyer c++17
add a comment
|
I was looking over some ugly code(that was modifying the underlying sequence while iterating), and to explore the definition of range based for loop I went to cppreference.
There I noticed something strange:
range based for loop changed in C++17, but I do not see the reason for change, and code looks the same to me(just "refactored").
So old one was:
auto && __range = range_expression ;
for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin)
range_declaration = *__begin;
loop_statement
New one is
auto && __range = range_expression ;
auto __begin = begin_expr ;
auto __end = end_expr ;
for ( ; __begin != __end; ++__begin)
range_declaration = *__begin;
loop_statement
My question is: why was this change made, and does it make any legal C++14 programs UB in C++17.
c++ for-loop language-lawyer c++17
add a comment
|
I was looking over some ugly code(that was modifying the underlying sequence while iterating), and to explore the definition of range based for loop I went to cppreference.
There I noticed something strange:
range based for loop changed in C++17, but I do not see the reason for change, and code looks the same to me(just "refactored").
So old one was:
auto && __range = range_expression ;
for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin)
range_declaration = *__begin;
loop_statement
New one is
auto && __range = range_expression ;
auto __begin = begin_expr ;
auto __end = end_expr ;
for ( ; __begin != __end; ++__begin)
range_declaration = *__begin;
loop_statement
My question is: why was this change made, and does it make any legal C++14 programs UB in C++17.
c++ for-loop language-lawyer c++17
I was looking over some ugly code(that was modifying the underlying sequence while iterating), and to explore the definition of range based for loop I went to cppreference.
There I noticed something strange:
range based for loop changed in C++17, but I do not see the reason for change, and code looks the same to me(just "refactored").
So old one was:
auto && __range = range_expression ;
for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin)
range_declaration = *__begin;
loop_statement
New one is
auto && __range = range_expression ;
auto __begin = begin_expr ;
auto __end = end_expr ;
for ( ; __begin != __end; ++__begin)
range_declaration = *__begin;
loop_statement
My question is: why was this change made, and does it make any legal C++14 programs UB in C++17.
c++ for-loop language-lawyer c++17
c++ for-loop language-lawyer c++17
edited 7 hours ago
Barry
201k22 gold badges379 silver badges673 bronze badges
201k22 gold badges379 silver badges673 bronze badges
asked 9 hours ago
NoSenseEtAlNoSenseEtAl
8,20218 gold badges79 silver badges197 bronze badges
8,20218 gold badges79 silver badges197 bronze badges
add a comment
|
add a comment
|
2 Answers
2
active
oldest
votes
Using
auto __begin = begin_expr, __end = end_expr;
requires both begin_expr
and end_expr
to return the same type. This means you cannot have a sentinel iterator type that is different from the beginning type. Using
auto __begin = begin_expr ;
auto __end = end_expr ;
fixes that issue while proving full backwards compatibility with C++14.
add a comment
|
It is explained later in the "notes":
As of C++17, the types of the begin_expr and the end_expr do not have to be the same ...
and you can't have that with:
auto __begin = begin_expr, __end = end_expr;
add a comment
|
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/4.0/"u003ecc by-sa 4.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f58208459%2fwhy-did-the-range-based-for-loop-specification-change-in-c17%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
Using
auto __begin = begin_expr, __end = end_expr;
requires both begin_expr
and end_expr
to return the same type. This means you cannot have a sentinel iterator type that is different from the beginning type. Using
auto __begin = begin_expr ;
auto __end = end_expr ;
fixes that issue while proving full backwards compatibility with C++14.
add a comment
|
Using
auto __begin = begin_expr, __end = end_expr;
requires both begin_expr
and end_expr
to return the same type. This means you cannot have a sentinel iterator type that is different from the beginning type. Using
auto __begin = begin_expr ;
auto __end = end_expr ;
fixes that issue while proving full backwards compatibility with C++14.
add a comment
|
Using
auto __begin = begin_expr, __end = end_expr;
requires both begin_expr
and end_expr
to return the same type. This means you cannot have a sentinel iterator type that is different from the beginning type. Using
auto __begin = begin_expr ;
auto __end = end_expr ;
fixes that issue while proving full backwards compatibility with C++14.
Using
auto __begin = begin_expr, __end = end_expr;
requires both begin_expr
and end_expr
to return the same type. This means you cannot have a sentinel iterator type that is different from the beginning type. Using
auto __begin = begin_expr ;
auto __end = end_expr ;
fixes that issue while proving full backwards compatibility with C++14.
edited 8 hours ago
answered 9 hours ago
NathanOliverNathanOliver
117k19 gold badges187 silver badges265 bronze badges
117k19 gold badges187 silver badges265 bronze badges
add a comment
|
add a comment
|
It is explained later in the "notes":
As of C++17, the types of the begin_expr and the end_expr do not have to be the same ...
and you can't have that with:
auto __begin = begin_expr, __end = end_expr;
add a comment
|
It is explained later in the "notes":
As of C++17, the types of the begin_expr and the end_expr do not have to be the same ...
and you can't have that with:
auto __begin = begin_expr, __end = end_expr;
add a comment
|
It is explained later in the "notes":
As of C++17, the types of the begin_expr and the end_expr do not have to be the same ...
and you can't have that with:
auto __begin = begin_expr, __end = end_expr;
It is explained later in the "notes":
As of C++17, the types of the begin_expr and the end_expr do not have to be the same ...
and you can't have that with:
auto __begin = begin_expr, __end = end_expr;
answered 9 hours ago
danadamdanadam
1,63712 silver badges12 bronze badges
1,63712 silver badges12 bronze badges
add a comment
|
add a comment
|
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f58208459%2fwhy-did-the-range-based-for-loop-specification-change-in-c17%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown