Почему тривиальная возможность копирования / перемещения зависит от тривиальной разрушаемости?

#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.