Код: Выделить всё
#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]).
emphasis mine
Then, per (11.4.5.3 §11):
A copy/move constructor for class X is 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
Мобильная версия