#c #c 11 #trivially-copyable
#c #c 11 #тривиально-копируемый
Вопрос:
Класс со всеми специальными функциями по умолчанию, за исключением нетривиального деструктора, не может быть тривиально сконструирован для перемещения или копирования. См https://godbolt.org/z/o83rPz для примера:
#include <type_traits>
class Sample
{
public:
Sample(Sample constamp;) = default;
Sample(Sampleamp;amp;) = default;
Sampleamp; operator=(Sample constamp;) = default;
Sampleamp; operator=(Sampleamp;amp;) = default;
~Sample() {}
};
static_assert(std::is_copy_constructible<Sample>::value, "");
static_assert(std::is_move_constructible<Sample>::value, "");
static_assert(std::is_trivially_copy_constructible<Sample>::value, ""); // Fails with GCC and Clang
static_assert(std::is_trivially_move_constructible<Sample>::value, ""); // Fails with GCC and Clang
static_assert(std::is_copy_assignable<Sample>::value, "");
static_assert(std::is_move_assignable<Sample>::value, "");
static_assert(std::is_trivially_copy_assignable<Sample>::value, "");
static_assert(std::is_trivially_move_assignable<Sample>::value, "");
Как GCC, так и Clang не выполняют соответствующие утверждения, в то время как ICC проходит. Как ни странно, назначения не затрагиваются, несмотря на то, что я мог понять, что назначенный объект должен быть уничтожен. Но, похоже, все наоборот. Почему? И почему ICC не согласен?
Комментарии:
1. Смотрите раздел примечаний здесь: en.cppreference.com/w/cpp/types/is_copy_constructible
2. @Nathan Может быть ответом там?
3. Соответствующий LWG — 2827 .
Ответ №1:
Я вижу, что в комментариях это уже упоминается. Ответ присутствует в разделе примечаний здесьhttps://en.cppreference.com/w/cpp/types/is_copy_constructible :
То же самое относится к
is_trivially_copy_constructible
, который в этих реализациях также требует, чтобы деструктор был тривиальным: ошибка GCC 51452 проблема LWG 2116.