Код: Выделить всё
#include
struct S
{
S(const S &) = delete;
S(S &&) = delete;
S & operator=(const S &) = delete;
S & operator=(S &&) = delete;
};
< /code>
из стандарта C ++ (11.2 §1) < /em>: < /p>
тривиально копируемый класс - это класс. или переместить оператор назначения ([special], [class.copy.ctor], [class.copy.assign]),
[*] где каждый подходящий конструктор копии, конструктор перемещения, оператор назначения копий и оператор для перевода. ([class.dtor]).
Mone
Затем, за (11.4.5.3 §11) :
Trivial [b], если это не предоставлено пользователем [/b] и если
[*] class x не имеет виртуальных функций ([class.virtual]), и нет виртуальных базовых классов ([class.mi]), и
, выбранное для копирования/перемещение каждого подборона-класса. Нестатический элемент данных x, который имеет тип класса (или их массив), конструктор, выбранный для копирования/перемещения этого члена, является тривиальным;
в противном случае конструктор копии/перемещение нетривиально. /> Если я что-то не пропустил, приведенный выше класс не следует считать тривиально копируемым в соответствии с (мое понимание) стандарта.static_assert(std::is_trivially_copyable_v);
Если это ошибка, мне кажется маловероятным, что оба компилятора будут иметь одну и ту же ошибку.
Следовательно, я предполагаю, что удаленные конструкторы не могут рассматриваться как пользовательские, которые могут сделать им, что они станут полями, которые будут подлежащими трюмам. /> Но ... я не могу найти нигде в стандарте, независимо от того, подтверждается ли это утверждение. < /p>
Подробнее здесь: https://stackoverflow.com/questions/796 ... as-trivial
Мобильная версия