std :: tuple присваивание и гарантии исключения копирования / перемещения - PullRequest
0 голосов
/ 29 сентября 2018

Я не вижу ничего о subj в текущем черновике.Правильно ли я понимаю, что следующему коду

struct Omg { Omg &operator=(Omg const &o) { throw 0; } };

std::tuple t0{42, Omg{}};
std::tuple t1{10, Omg{}};
t1 = t0;

полностью разрешено оставлять t1 в частично назначенном состоянии?То есть его первый элемент мог уже измениться, но второй может остаться таким, каким он был, или даже стать несогласованным?

1 Ответ

0 голосов
/ 29 сентября 2018

полностью разрешено оставлять t1 в частично назначенном состоянии?

Да. Копирование-назначение указывается как:

Эффекты: Назначает каждый элемент u соответствующему элементу *this.

В стандартной библиотеке есть другие типы, в которых do указывает гарантию исключения (например, optional), но tuple не предоставляет ее.

Обратите внимание, что в нем не указан порядок назначения.Реализация может назначить Omg первым (то есть без изменений на t1) или int первым (так что в итоге вы получите полуприспределенное состояние).

Я думаю, что реализация может также выбрать копирование и обмен и, таким образом, предоставить надежную гарантию исключения.Это будет соответствовать указанным эффектам.Но это не гарантируется стандартом.

...