Question

std::tie returns a tuple of references, so you can do the following:

int foo, bar, baz;
std::tie(foo, bar, baz) = std::make_tuple(1, 2, 3);

This is similar to foo, bar, baz = (1, 2, 3) in Python.

What is supposed to happen if one of the assignments throws, as in the following example?

int foo = 1337;
struct Bar {
    Bar& operator=(Bar) { throw std::exception{}; }
} bar;
try {
    std::tie(foo, bar) = std::make_tuple(42, Bar{});
} catch (std::exception const&) {
    std::cout << foo << '\n';
}

Will it print 1337 or 42, or is this unspecified?

Was it helpful?

Solution

The Standard speaks of tuple assignment art §20.4.2.2 [tuple.assign], the only mention of exception is that the assignment should not throw unless one of the elements assigned to throws.

Since there is no mention of the order in which elements are assigned to, it is thus unspecified.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top