Насколько безопасно исключить 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, или это неуказано?
Ответы
Ответ 1
В стандарте говорится о присвоении набора символов §20.4.2.2 [tuple.assign], единственным упоминанием об исключении является то, что присваивание не должно выбрасываться, если только один из элементов, назначенных для бросков.
Поскольку не упоминается порядок, в котором назначены элементы, он, таким образом, не указан.