Warum sind nicht alle (P2786) trivial verschiebbaren Typen Typen mit impliziter Lebensdauer?C++

Programme in C++. Entwicklerforum
Anonymous
 Warum sind nicht alle (P2786) trivial verschiebbaren Typen Typen mit impliziter Lebensdauer?

Post by Anonymous »

Bedenken Sie den folgenden Code:

Code: Select all

#include 

struct A trivially_relocatable_if_eligible final {
A() {}

A(A const&)            = delete;
A& operator=(A const&) = delete;

~A() {}
};

static_assert(std::is_implicit_lifetime_v); // true in clang-21.1.0-rc2
Gemäß dem neuesten C++-Standard n5008 (11.2/p16 [class.prop]):

Eine Klasse S ist eine Klasse mit impliziter Lebensdauer, wenn
  • (16.1) es sich um ein Aggregat handelt, dessen Destruktor nicht vom Benutzer bereitgestellt wird oder
  • (16.2) Es verfügt über mindestens einen trivialen geeigneten Konstruktor und einen trivialen, nicht gelöschten Destruktor.

Code: Select all

std::is_implicit_lifetime_v
sollte falsch sein, da A (16.1) oder (16.2) nicht erfüllt und daher kein impliziter Lebensdauertyp ist!
Beachten Sie, dass es in einigen Fällen notwendig ist, std::start_lifetime_as 1 nach einer trivialen Verschiebung aufzurufen 2, also denke ich trivial Verschiebbare Typen und ersetzbare Typen sollten beide als implizite Lebensdauertypen definiert werden (wie es clang-21.1.0-rc2 tut), aber der C++-Standard scheint dies nicht zu tun.
Ist es ein Versehen des C++-Standards? Oder nur mein Missverständnis?

1 std::start_lifetime_as erfordert, dass der zugehörige Typ ein impliziter Lebensdauertyp sein muss.
2 https://www.open-std.org/jtc1/sc22/wg21 ... 86r13.html

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post