Structured binding on const The 2019 Stack Overflow Developer Survey Results Are In Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern) The Ask Question Wizard is Live! Data science time! April 2019 and salary with experienceHow to convert a std::string to const char* or char*?What is the difference between const int*, const int * const, and int const *?const pointers in overload resolutionString literal in templates - different behavior of compilersConfirm This Standard Library Bug Relating to Allocators in MSVC 2015 RCCapturing array of vectors in lambda makes elements constExplicit destructor call with decltypeWhy “int & const” compiles fine with MSVC?Visual accept std::string from std::byte iteratorShall structured binding to a copy of a const c-array be const?
How does ice melt when immersed in water
Change bounding box of math glyphs in LuaTeX
Typeface like Times New Roman but with "tied" percent sign
How to politely respond to generic emails requesting a PhD/job in my lab? Without wasting too much time
Windows 10: How to Lock (not sleep) laptop on lid close?
how can a perfect fourth interval be considered either consonant or dissonant?
Do working physicists consider Newtonian mechanics to be "falsified"?
Why does the Event Horizon Telescope (EHT) not include telescopes from Africa, Asia or Australia?
Is above average number of years spent on PhD considered a red flag in future academia or industry positions?
Derivation tree not rendering
First use of “packing” as in carrying a gun
When did F become S in typeography, and why?
Why did all the guest students take carriages to the Yule Ball?
What are these Gizmos at Izaña Atmospheric Research Center in Spain?
What do you call a plan that's an alternative plan in case your initial plan fails?
Why can't wing-mounted spoilers be used to steepen approaches?
Does the AirPods case need to be around while listening via an iOS Device?
Single author papers against my advisor's will?
Wall plug outlet change
Can undead you have reanimated wait inside a portable hole?
Working through the single responsibility principle (SRP) in Python when calls are expensive
How are presidential pardons supposed to be used?
What's the point in a preamp?
What is special about square numbers here?
Structured binding on const
The 2019 Stack Overflow Developer Survey Results Are In
Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)
The Ask Question Wizard is Live!
Data science time! April 2019 and salary with experienceHow to convert a std::string to const char* or char*?What is the difference between const int*, const int * const, and int const *?const pointers in overload resolutionString literal in templates - different behavior of compilersConfirm This Standard Library Bug Relating to Allocators in MSVC 2015 RCCapturing array of vectors in lambda makes elements constExplicit destructor call with decltypeWhy “int & const” compiles fine with MSVC?Visual accept std::string from std::byte iteratorShall structured binding to a copy of a const c-array be const?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;
Is the following code supposed to compile?
#include <type_traits>
void foo()
const std::pair<int, int> x = 1, 2;
auto [a, b] = x;
static_assert(std::is_const_v<decltype(a)>);
static_assert(std::is_const_v<decltype(b)>);
MSVC says "yes!".
GCC says "oh no, man!".
Clang says "no way!".
So, is this an MSVC bug?
The standard is not straightforward here (I had a quick look), but considering the rules for auto, I suppose, a and b should be copied discarding cv-qualifier.
c++ c++17 structured-bindings
add a comment |
Is the following code supposed to compile?
#include <type_traits>
void foo()
const std::pair<int, int> x = 1, 2;
auto [a, b] = x;
static_assert(std::is_const_v<decltype(a)>);
static_assert(std::is_const_v<decltype(b)>);
MSVC says "yes!".
GCC says "oh no, man!".
Clang says "no way!".
So, is this an MSVC bug?
The standard is not straightforward here (I had a quick look), but considering the rules for auto, I suppose, a and b should be copied discarding cv-qualifier.
c++ c++17 structured-bindings
add a comment |
Is the following code supposed to compile?
#include <type_traits>
void foo()
const std::pair<int, int> x = 1, 2;
auto [a, b] = x;
static_assert(std::is_const_v<decltype(a)>);
static_assert(std::is_const_v<decltype(b)>);
MSVC says "yes!".
GCC says "oh no, man!".
Clang says "no way!".
So, is this an MSVC bug?
The standard is not straightforward here (I had a quick look), but considering the rules for auto, I suppose, a and b should be copied discarding cv-qualifier.
c++ c++17 structured-bindings
Is the following code supposed to compile?
#include <type_traits>
void foo()
const std::pair<int, int> x = 1, 2;
auto [a, b] = x;
static_assert(std::is_const_v<decltype(a)>);
static_assert(std::is_const_v<decltype(b)>);
MSVC says "yes!".
GCC says "oh no, man!".
Clang says "no way!".
So, is this an MSVC bug?
The standard is not straightforward here (I had a quick look), but considering the rules for auto, I suppose, a and b should be copied discarding cv-qualifier.
c++ c++17 structured-bindings
c++ c++17 structured-bindings
edited Mar 25 at 12:19
einpoklum
37.3k28134263
37.3k28134263
asked Mar 24 at 23:44
Biagio FestaBiagio Festa
5,43121240
5,43121240
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
Is the following code supposed to compile?
It is not. This is an MSVC bug.
A structured binding declaration introduces a new name (for specification only), e, that is declared like:
auto e = x;
The type of e is called E, and since the initializer is tuple-like, the types of the bindings are given by tuple_element_t<i, E>. In this case E is pair<int, int>, so the two types are just int. The rule for decltype of a structured binding is to give the referenced type, so decltype(a) and decltype(b) are both int.
The important part here is that a and b (the structured bindings) come from the invented variable (e), and not its initializer (x). e is not const because you just declared it auto. What we're doing is copying x, and then taking bindings into this (non-const) copy.
add a comment |
The static assertions in your code should fail. Why? Because your code is basically the same as the case of:
#include <type_traits>
void foo()
const int x_1 = 1;
const int x_2 = 2;
auto a = x_1;
auto b = x_2;
static_assert(std::is_const_v<decltype(a)>);
static_assert(std::is_const_v<decltype(b)>);
which does indeed fail on MSVC as well.
In C++, expression types decay on assignment: the auto sees an int, not a const int. Structured binding simply lets you do more than a single auto binding at a time.
... and so the fact that MSVC doesn't fail on the assertions in your code seems to be a bug.
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/3.0/"u003ecc by-sa 3.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%2f55329651%2fstructured-binding-on-const%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
Is the following code supposed to compile?
It is not. This is an MSVC bug.
A structured binding declaration introduces a new name (for specification only), e, that is declared like:
auto e = x;
The type of e is called E, and since the initializer is tuple-like, the types of the bindings are given by tuple_element_t<i, E>. In this case E is pair<int, int>, so the two types are just int. The rule for decltype of a structured binding is to give the referenced type, so decltype(a) and decltype(b) are both int.
The important part here is that a and b (the structured bindings) come from the invented variable (e), and not its initializer (x). e is not const because you just declared it auto. What we're doing is copying x, and then taking bindings into this (non-const) copy.
add a comment |
Is the following code supposed to compile?
It is not. This is an MSVC bug.
A structured binding declaration introduces a new name (for specification only), e, that is declared like:
auto e = x;
The type of e is called E, and since the initializer is tuple-like, the types of the bindings are given by tuple_element_t<i, E>. In this case E is pair<int, int>, so the two types are just int. The rule for decltype of a structured binding is to give the referenced type, so decltype(a) and decltype(b) are both int.
The important part here is that a and b (the structured bindings) come from the invented variable (e), and not its initializer (x). e is not const because you just declared it auto. What we're doing is copying x, and then taking bindings into this (non-const) copy.
add a comment |
Is the following code supposed to compile?
It is not. This is an MSVC bug.
A structured binding declaration introduces a new name (for specification only), e, that is declared like:
auto e = x;
The type of e is called E, and since the initializer is tuple-like, the types of the bindings are given by tuple_element_t<i, E>. In this case E is pair<int, int>, so the two types are just int. The rule for decltype of a structured binding is to give the referenced type, so decltype(a) and decltype(b) are both int.
The important part here is that a and b (the structured bindings) come from the invented variable (e), and not its initializer (x). e is not const because you just declared it auto. What we're doing is copying x, and then taking bindings into this (non-const) copy.
Is the following code supposed to compile?
It is not. This is an MSVC bug.
A structured binding declaration introduces a new name (for specification only), e, that is declared like:
auto e = x;
The type of e is called E, and since the initializer is tuple-like, the types of the bindings are given by tuple_element_t<i, E>. In this case E is pair<int, int>, so the two types are just int. The rule for decltype of a structured binding is to give the referenced type, so decltype(a) and decltype(b) are both int.
The important part here is that a and b (the structured bindings) come from the invented variable (e), and not its initializer (x). e is not const because you just declared it auto. What we're doing is copying x, and then taking bindings into this (non-const) copy.
answered Mar 24 at 23:53
BarryBarry
187k21330607
187k21330607
add a comment |
add a comment |
The static assertions in your code should fail. Why? Because your code is basically the same as the case of:
#include <type_traits>
void foo()
const int x_1 = 1;
const int x_2 = 2;
auto a = x_1;
auto b = x_2;
static_assert(std::is_const_v<decltype(a)>);
static_assert(std::is_const_v<decltype(b)>);
which does indeed fail on MSVC as well.
In C++, expression types decay on assignment: the auto sees an int, not a const int. Structured binding simply lets you do more than a single auto binding at a time.
... and so the fact that MSVC doesn't fail on the assertions in your code seems to be a bug.
add a comment |
The static assertions in your code should fail. Why? Because your code is basically the same as the case of:
#include <type_traits>
void foo()
const int x_1 = 1;
const int x_2 = 2;
auto a = x_1;
auto b = x_2;
static_assert(std::is_const_v<decltype(a)>);
static_assert(std::is_const_v<decltype(b)>);
which does indeed fail on MSVC as well.
In C++, expression types decay on assignment: the auto sees an int, not a const int. Structured binding simply lets you do more than a single auto binding at a time.
... and so the fact that MSVC doesn't fail on the assertions in your code seems to be a bug.
add a comment |
The static assertions in your code should fail. Why? Because your code is basically the same as the case of:
#include <type_traits>
void foo()
const int x_1 = 1;
const int x_2 = 2;
auto a = x_1;
auto b = x_2;
static_assert(std::is_const_v<decltype(a)>);
static_assert(std::is_const_v<decltype(b)>);
which does indeed fail on MSVC as well.
In C++, expression types decay on assignment: the auto sees an int, not a const int. Structured binding simply lets you do more than a single auto binding at a time.
... and so the fact that MSVC doesn't fail on the assertions in your code seems to be a bug.
The static assertions in your code should fail. Why? Because your code is basically the same as the case of:
#include <type_traits>
void foo()
const int x_1 = 1;
const int x_2 = 2;
auto a = x_1;
auto b = x_2;
static_assert(std::is_const_v<decltype(a)>);
static_assert(std::is_const_v<decltype(b)>);
which does indeed fail on MSVC as well.
In C++, expression types decay on assignment: the auto sees an int, not a const int. Structured binding simply lets you do more than a single auto binding at a time.
... and so the fact that MSVC doesn't fail on the assertions in your code seems to be a bug.
edited Mar 31 at 17:33
answered Mar 24 at 23:53
einpoklumeinpoklum
37.3k28134263
37.3k28134263
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%2f55329651%2fstructured-binding-on-const%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