Ist neu interpret_cast zwischen nicht verwandten Typen zulässig, wenn sie in C ++ 20 Standardlayout sindC++

Programme in C++. Entwicklerforum
Anonymous
 Ist neu interpret_cast zwischen nicht verwandten Typen zulässig, wenn sie in C ++ 20 Standardlayout sind

Post by Anonymous »

Es gab bereits viele Fragen zu Abgüssen, aber seit C ++ 20 gibt es einige zusätzliche Konstrukte, die sich auf Typ -Abgüsse und damit diese Frage beziehen. Betrachten Sie die folgende Klassenstruktur. < /P>

Code: Select all

struct A {
int index;
}

struct B: A {}

static_assert(std::is_standard_layout_v, "test");
static_assert(std::is_standard_layout_v, "test");
Beide Typen sind Standard-Layout , die wir über ein static_assert überprüfen können. Für diese gemäß den folgenden Standardnätern: < /p>

Zwei Objekte A und B sind Zeigerinterkonvertierbar, wenn: < /p>

Einer ist ein Standard-Layout-Klassenobjekt, und das andere ist das erste nicht-statische Datenmitglied dieses Objekts, das das Objekt des Objekts, das Objekt des Objekts, ohne statische Daten, ein Objekt des Objekts, das das Objekt ohne statische Daten ist. (11.4) oder < /li>
< /ul>
< /blockquote>
bedeutet, dass der folgende Code zulässig sein sollte: < /p>

Code: Select all

A a = {};
int* i = reinterpret_cast(&a);
B* b = reinterpret_cast(i);
meine Frage ist jedoch, ob sie tatsächlich B für irgendetwas verwenden darf. Insbesondere scheint es mir, dass Typ-Aliasing-Regeln den Zugriff auf (oder schreiben) lvalue b < /code> gemäß der folgenden Anweisung verbieten. Undefiniert. Die Leute wundern sich über den Kontext. Es stammt aus einer Legacy -Code -Basis, in der A über einige Accessors verfügt und B (und viele andere abgeleitete Typen) im Wesentlichen unterschiedliche Ansichten zu diesem zugrunde liegenden Objekt sind, und manchmal ist es erforderlich, zwischen diesen Typen zu konvertieren (und in der tatsächlichen Implementierung ist dies teuer). Zu der Zeit, dass die Menschen jedoch seit Ausrichtung und Größe gleich sind, dass solche Abgüsse solide und billiger sind als explizite Konstruktionen. Im Allgemeinen scheint dies jedoch nicht der Fall zu sein. Leider konnte ich kein Compiler -Flag oder Desinfektionsmittel finden, der tatsächlich zeigt, dass dies UB ist oder in der Lage war, ein Beispiel zu erstellen, in dem dies schief geht.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post