Насколько безопасна исключительная ситуация std :: tie?

std::tie возвращает набор ссылок, поэтому вы можете сделать следующее:

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

Это похоже на foo, bar, baz = (1, 2, 3) в Python.

Что должно произойти, если выбрасывает одно из заданий, как в следующем примере?

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';
}

Будет ли напечатано 1337 или 42, или это не указано?

10

Решение

Стандарт говорит об искусстве назначения кортежей §20.4.2.2 [tuple.assign], единственное упоминание об исключении — это то, что присвоение не должно выбрасывать, если один из элементов не назначен для бросков.

Поскольку нет никакого упоминания о порядке, в котором элементы назначены, таким образом, неопределенные.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]