Use auto for only one variable with structured binding

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


std::tie(auto x, y) = func(y); // this does not work

3 Answers

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

Add your own answers!

Related Questions

Zoom image using css

4  Asked on February 1, 2021 by kango


How to make double border lines in the UIImage with the Swift?

3  Asked on February 1, 2021 by antonio-adrian-chavez


File Transfer Protocol using TCP

1  Asked on February 1, 2021 by thedafferg


Public API for all state tax names

1  Asked on January 31, 2021 by nitish


Remove event before remove DOM element everytime

1  Asked on January 31, 2021 by justanewcoder


lodash find returns only one result

1  Asked on January 31, 2021 by manuelbetancurt


api not call using dispatch

0  Asked on January 31, 2021 by codetribe


Reactjs using nginx not giving a 404

0  Asked on January 31, 2021 by keurig


Ask a Question

Get help from others!

© 2022 All rights reserved. Sites we Love: PCI Database, MenuIva, UKBizDB, Menu Kuliner, Sharing RPP, SolveDir