Structured binding on constWhat is the difference between const int*, const int * const, and int const *?String literal in templates - different behavior of compilersstructured binding with [[maybe_unused]]Capturing array of vectors in lambda makes elements constExplicit destructor call with decltypeWhy “int & const” compiles fine with MSVC?Discards qualifiers unknown cause (std::bind() / lambda)Visual accept std::string from std::byte iteratorC++17 - Binding rvalue reference to non-const lvalue refShall structured binding to a copy of a const c-array be const?
Varistor? Purpose and principle
Why is Arduino resetting while driving motors?
Proof of Lemma: Every nonzero integer can be written as a product of primes
How much character growth crosses the line into breaking the character
Could the E-bike drivetrain wear down till needing replacement after 400 km?
How do you respond to a colleague from another team when they're wrongly expecting that you'll help them?
Transformation of random variables and joint distributions
Why has "pence" been used in this sentence, not "pences"?
Structured binding on const
Diode in opposite direction?
Do Legal Documents Require Signing In Standard Pen Colors?
Are all species of CANNA edible?
Divine apple island
Did arcade monitors have same pixel aspect ratio as TV sets?
We have a love-hate relationship
Indicating multiple different modes of speech (fantasy language or telepathy)
Is it improper etiquette to ask your opponent what his/her rating is before the game?
Is a model fitted to data or is data fitted to a model?
Generating adjacency matrices from isomorphic graphs
Why did the EU agree to delay the Brexit deadline?
Can a significant change in incentives void an employment contract?
Why in book's example is used 言葉(ことば) instead of 言語(げんご)?
Can I use my Chinese passport to enter China after I acquired another citizenship?
Should I install hardwood flooring or cabinets first?
Structured binding on const
What is the difference between const int*, const int * const, and int const *?String literal in templates - different behavior of compilersstructured binding with [[maybe_unused]]Capturing array of vectors in lambda makes elements constExplicit destructor call with decltypeWhy “int & const” compiles fine with MSVC?Discards qualifiers unknown cause (std::bind() / lambda)Visual accept std::string from std::byte iteratorC++17 - Binding rvalue reference to non-const lvalue refShall structured binding to a copy of a const c-array be const?
Is the following code supposed to compile?
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?
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?
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?
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
asked 6 hours ago
Biagio FestaBiagio Festa
5,19321239
5,19321239
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 should fail (so this would be an MSVC bug I guess). Why? Because it's basically the same as the case of:
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.
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 6 hours ago
BarryBarry
185k21325600
185k21325600
add a comment |
add a comment |
The static assertions should fail (so this would be an MSVC bug I guess). Why? Because it's basically the same as the case of:
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.
add a comment |
The static assertions should fail (so this would be an MSVC bug I guess). Why? Because it's basically the same as the case of:
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.
add a comment |
The static assertions should fail (so this would be an MSVC bug I guess). Why? Because it's basically the same as the case of:
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.
The static assertions should fail (so this would be an MSVC bug I guess). Why? Because it's basically the same as the case of:
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.
edited 6 hours ago
answered 6 hours ago
einpoklumeinpoklum
36.1k28132260
36.1k28132260
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