Любой способ иметь неявный тип жизни с определенным пользователем конструктором?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Любой способ иметь неявный тип жизни с определенным пользователем конструктором?

Сообщение Anonymous »

tldr; < /p>
Можем ли мы сделать необратимый, не мощный класс с нулевой инициализацией по умолчанию в неявный тип жизни без изменения существующих конструкторов? < /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 () {} ).
Технически, foo :: foo (TAG_T) не является тривиальным конструктором (то же самое для foo () {} ).
Кроме того, эталонная реализация std :: is_implicite_lifetime в p2674 проверяет только конструкторы по умолчанию/копию/перемещение на тривиальность. Я получаю это, потому что все остальное потребует поддержки компилятора. Однако сам стандарт говорит любой конструктор , и компилятор может видеть, что этот конструктор ничего не делает, поэтому он может 'M скрещивал мои пальцы и пальцы ног.
Итак, учитывая, что конструкторы по умолчанию/копию/перемещение не являются тривиальными - как сделать Foo в неявный тип времени жизни - без изменения текущего конструктора по умолчанию/копии/перемещению - это будет Разбейте любой текущий код, который использует эти типы? Это для, да, да, это для друга. Видите ли, в стандартной библиотеке уже есть хотя бы один, как минимум. Тот, который обрабатывается так, как если бы это был неявный тип жизни во многих существующих кодексах. Но технически это не так, и я пытаюсь сделать это без необходимости писать бумагу.

Подробнее здесь: https://stackoverflow.com/questions/794 ... onstructor
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»