Является ли std :: is_trivially_copyable неправильно? - PullRequest
0 голосов
/ 06 июня 2018

Учитывая cppreference и текущий рабочий проект c ++, класс легко копируется, если:

  1. Каждый конструктор копирования тривиален или удален
  2. Каждый конструктор перемещения тривиален или удален
  3. Каждый оператор назначения копирования тривиален или удален
  4. Каждый оператор назначения перемещения тривиален или удален
  5. по крайней мере один конструктор копирования, конструктор перемещения, оператор назначения копирования или перемещениеОператор присваивания не удален
  6. Тривиальный неразрушенный деструктор

Итак, я пришел с этим примером кода:

#include <type_traits>

struct non_trivially_copyable {
  non_trivially_copyable(non_trivially_copyable const&) = delete;
  non_trivially_copyable& operator=(non_trivially_copyable const&) = delete;
  non_trivially_copyable(non_trivially_copyable &&) = delete;
  non_trivially_copyable& operator=(non_trivially_copyable &&) = delete;
};

int main()
{
    return std::is_trivially_copyable<non_trivially_copyable>::value;
}

Мой класс не соответствует номеру требования5. Тем не менее это дает мне результат, что мой класс non_trivially_copyable легко копируется.Я тестировал его на некоторых онлайн-компиляторах:

Я сомневаюсь, что все реализации неверны;так почему я получаю этот результат?

1 Ответ

0 голосов
/ 06 июня 2018

Это было изменено в C ++ 17;до этого non_trivially_copyable можно было бы просто скопировать.Ваш класс действительно нетривиально копируемый в C ++ 17, в той части стандарта, на которую вы ссылаетесь.

Однако кажется, что libstdc ++ и libc ++ не были обновлены, чтобы отразить это.Итак, чтобы ответить на ваш вопрос напрямую: эти две реализации действительно неверны.Обратите внимание, что ваша ссылка Godbolt показывает, что MSVC все делает правильно.

Поскольку это считалось дефектом (см. CWG 1734 ), это должно измениться для реализаций старых версий C ++,тоже.


Насколько я знаю, одним из основных мотивов изменений в стандарте было недопущение memcpy -объединения вокруг атомных элементов и мьютексов.

...