Можем ли мы сделать необратимый, не мощный класс с нулевой инициализацией по умолчанию в неявный тип жизни без изменения существующих конструкторов? < /p>
непосредственно из спецификации C ++ 23, 11,2 < /p>
Код: Выделить всё
9 A class S is an implicit-lifetime class if
(9.1) — it is an aggregate whose destructor is not user-provided or
(9.2) — it has at least one trivial eligible constructor and a trivial, non-deleted destructor.
< /code>
Но что означает «хотя бы один»? Похоже, любой из многих возможных конструкторов. Тем не менее, спецификация также говорит, что для конструктора быть тривиальным, это должно быть ... < /p>
Implicitly declared or explicitly defaulted (= default) on its first declaration.
< /code>
Поскольку только специальные функции членов могут быть любыми из них, только специальные функции членов могут быть технически тривиальными. Итак, ответ, на мой взгляд: не шанс. />
Рассмотрим это минимизированное существующий класс.template
struct Foo
{
T t;
Foo() : t() { }
Foo(Foo const &) = delete;
Foo(Foo &&) = delete;
};
static_assert(not std::is_trivially_default_constructible_v);
static_assert(not std::is_trivially_copy_constructible_v);
static_assert(not std::is_trivially_move_constructible_v);
< /code>
Но мы хотим иметь возможность использовать экземпляры такого типа в ситуациях, которые требуют, чтобы он был неявным типом времени жизни (когда t можно использовать таким образом). В настоящее время не является неявным типом времени жизни. < /P>
Итак, мы добавляем это.template
struct Foo
{
// ...
Foo(tag_t) { } // Kneel, bow, and pray...
};
Технически, foo :: foo (TAG_T) не является тривиальным конструктором (то же самое для foo () {} ).
Кроме того, эталонная реализация std :: is_implicite_lifetime в p2674 проверяет только конструкторы по умолчанию/копию/перемещение на тривиальность. Я получаю это, потому что все остальное потребует поддержки компилятора. Однако сам стандарт говорит любой конструктор , и компилятор может видеть, что этот конструктор ничего не делает, поэтому он может 'M скрещивал мои пальцы и пальцы ног.
Итак, учитывая, что конструкторы по умолчанию/копию/перемещение не являются тривиальными - как сделать Foo в неявный тип времени жизни - без изменения текущего конструктора по умолчанию/копии/перемещению - это будет Разбейте любой текущий код, который использует эти типы? Это для, да, да, это для друга. Видите ли, в стандартной библиотеке уже есть хотя бы один, как минимум. Тот, который обрабатывается так, как если бы это был неявный тип жизни во многих существующих кодексах. Но технически это не так, и я пытаюсь сделать это без необходимости писать бумагу.
Подробнее здесь: https://stackoverflow.com/questions/794 ... onstructor
Мобильная версия