Stack Overflow Asked by Håkon Hægland on December 13, 2020
I am trying to update a variable passed to a function with a structured binding:
#include <iostream>
#include <tuple>
#include <utility>
std::pair<int, double> func(double y)
{
return {1, 1.3+y};
}
int main() {
double y = 1.0;
auto [x, y2] = func(y);
y = y2;
std::cout << "x = " << x << ", y = " << y << 'n';
return 0;
}
Is it possible to avoid the extra assignment y = y2
and using something like
[auto x, y] = func(y); // this does not work
or
std::tie(auto x, y) = func(y); // this does not work
To answer your question narrowly:
No, you can't reuse an existing variable in a structured binding. Structured binding always declares new variables.
That being said, there are other options - like std::tie
, as @Robert A has demonstrated.
Correct answer by Marshall Clow on December 13, 2020
A structured binding is a declaration; it cannot be used e.g. for assignment into an already declared variable.
If you are allowed to move the declaration of y
and you ever only need it to make a function call, you could abuse the scope of the the capture list of an immediately invoked lambda, and let it shadow (only within the scope of the lambda) the variable y
that is declared as part of a structured binding, which is in turn initialized using the return from the immediately invoked lambda:
auto [x, y] = [y = 1.0](){ return func(y); }();
// ^^^^^^^ actually not at all in namespace scope,
// but a data member of the closure type
// of the lambda expression.
You could likewise use a named lambda:
const auto l = [y = 1.0](){ return func(y); };
auto [x, y] = l();
As is typically the case with shadowing alongside the somewhat complex scoping rules of C++, this is likely only to confuse readers, though.
Answered by dfrib on December 13, 2020
A third option:
decltype(func(y).first) x;
std::tie(x, y) = func(y);
Answered by Robert Andrzejuk on December 13, 2020
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP