Всегда ли std :: memmove безопасен между одним и тем же объектом? - PullRequest
1 голос
/ 22 января 2020

Всегда ли безопасно std::memmove между одними и теми же экземплярами объекта (включая подобъекты).

То есть следующий сейф для любого T и любого t, и он покинет t без изменений:

template <typename T>
void maybe_copy(T& t) {
  std::memmove(&t, &t, sizeof(T));
}

Как следствие, всегда ли безопасно следующее:

template <typename T>
void redundant_copy(T& s, const T& d) {
  if (std::addressof(s) == std::addressof(d)) {
    std::memmove(&d, &s, sizeof(T));
  }
}

1 Ответ

0 голосов
/ 22 января 2020

Нет, это не всегда безопасно.

С https://en.cppreference.com/w/cpp/string/byte/memmove

Если объекты потенциально перекрываются или не TriviallyCopyable , поведение memmove не указано и может быть неопределенным .

Что может перекрываться?
С https://en.cppreference.com/w/cpp/language/object#Subobjects

Субобъект потенциально перекрывается, если он равен

. подобъект базового класса, или
. не статичный c элемент данных, объявленный с атрибутом [[ no_unique_address ]].

Я предполагаю, что мне не нужно публиковать определение TriviallyCopyable в этом ответе.

...