Einheitliche Initialisierung der abgeleiteten Klasse mit trivialem ctor

8

Ich versuche, meinen Kopf um einige Ecken Fälle mit C ++ 11 einheitliche Initialisierung zu wickeln und ich kann nicht herausfinden, warum das ist:

%Vor%

Die mit 2 markierte Zeile schlägt sowohl mit clang 3.1 als auch mit g++ 4.7 mit einer "kein übereinstimmender Konstruktor für die Initialisierung von Derived" fehl.

Ich kann nicht verstehen, warum im Fall von Derived versucht wird, einen Konstruktor aufzurufen und nicht auszuführen (ich weiß nicht, wie ich es nennen soll, vielleicht Initialisierung initialisieren ), wie es ist der Fall für Zeile 1).

Etwas in der folgenden Argumentation ist falsch?:

A) Trivial garantiert, dass es statisch initialisiert werden kann

B) Um statisch initialisiert zu werden, darf zur Laufzeit kein Code ausgeführt werden, daher ist kein Konstruktoraufruf erforderlich A+B = & gt; Warum versucht es, einen Konstruktor auf einen Typ zu verweisen, von dem er weiß, dass er trivial ist?

Ich bin sehr verwirrt ....

    
abigagli 29.11.2012, 12:23
quelle

1 Antwort

11

Trivial zu sein hat nichts damit zu tun, wie man etwas initialisieren kann. Das wichtige Bit ist, ob Ihr Derived -Typ ein Aggregat ist, was nicht der Fall ist:

§8.5.1 [dcl.init.aggr] p1

  

Ein Aggregat ist ein Array oder eine Klasse (Abschnitt 9) ohne von Benutzern bereitgestellte Konstruktoren (12.1), keine Klammer-oder-gleich-Initialisierer für statische Datenelemente (9.2), keine privaten oder geschützten nicht statischen Datenelemente (Abschnitt 11), keine Basisklassen (Abschnitt 10) und keine virtuellen Funktionen (10.3).

Nur Aggregate können mit der Aggregat-Initialisierung initialisiert werden, so dass die Listen-Initialisierung (der offizielle Name für die einheitliche Initialisierung) nur versuchen kann, nach einem passenden Konstruktor zu suchen.

Sie können einen constexpr -Konstruktor bereitstellen, der an die Basisklasse weiterleitet, und einen default ed-Standardkonstruktor hinzufügen:

%Vor%     
Xeo 29.11.2012, 12:41
quelle