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
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_vBeachten 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
Mobile version