Учитывая cppreference и текущий рабочий черновик C++, класс можно легко скопировать, если:
Тривиальный неудаленный деструктор
Итак, я придумал этот пример кода:
#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 легко копируется. Я тестировал его на некоторых онлайн-компиляторах:
Я сомневаюсь, что все реализации ошибочны; так почему я получаю такой результат?





Это было изменено в C++ 17; до этого non_trivially_copyable можно было легко копировать. Ваш класс действительно не может быть легко скопирован в C++ 17 той частью стандарта, на которую вы ссылаетесь.
Однако похоже, что libstdC++ и libC++ еще не обновлены, чтобы отразить это. Итак, чтобы ответить прямо на ваш вопрос: эти две реализации действительно неверны. Обратите внимание, что ваша ссылка на Godbolt показывает, что MSVC все правильно понимает.
Поскольку это считалось дефектом (см. CWG 1734), это также должно измениться для реализаций более старых версий C++.
Насколько мне известно, одной из основных причин изменения стандарта было сделать незаконным использование memcpy, связанного с атомами и мьютексами.
@ phön Да, рано или поздно другие реализации тоже должны соответствовать. C++ 17 все еще довольно новый; Обычно это может занять некоторое время, пока все изменения в стандарте не будут полностью реализованы.
хорошо, так что я понял это концептуально правильно: P я думаю, другие реализации будут следовать за msvc с "правильной" вещью когда-нибудь?