To my knowledge, identifiers introduced by structured bindings in C++17 are in fact references to some \"hidden\" variable. Such that
auto [ a, b ] = std::ma
if I print out
std::is_reference, I get 0 in the first case 1 in the second.::value
Why is that even if we can prove that a and b refer to the elements in the tuple and one can modify those values by means of them?
I'm not a language lawyer, but probably it is due to this bullet of the standard (working draft):
if
eis an unparenthesized id-expression naming a structured binding [...],decltype(e)is the referenced type as given in the specification of the structured binding declaration
Side note. You should use this form to do so that a and b refer to the elements in the tuple:
auto tup = std::make_tuple(1, 2);
auto & [ a, b ] = tup;
It follows a minimal, working example:
#include
#include
#include
int main() {
auto tup = std::make_tuple(1, 2);
auto & [ a, b ] = tup;
a = 0;
std::cout << a << ", " << std::get<0>(tup) << std::endl;
}
See it on Coliru. On the other side, what you get is a copy of the values using the expression below:
auto [ a, b ] = std::make_tuple(1, 2);
Here is an article that explains it better and is a bit more comprehensible than the standard for humans.