Ist dieser Code C++ (11) gültig?Geschachtelte Klasse durch Mehrfachvererbung ausgeblendet
struct Base {
template <typename>
struct nested;
};
struct Derived1 : Base { };
struct Derived2 : Base { };
struct Derived3 : Derived1, Derived2 { };
typedef Derived3::nested<int> xxx;
Was ich weiß
Der obige Code nicht mit kompilieren:
- von Apple LLVM 5.0 (Klirren-500.2.75)
- Clang 3,4
Aber es kompiliert erfolgreich mit:
- gcc 4.9.0 20.131.110 (experimentell)
- gcc 4,8
Auch wenn ich die nested
Typ in einen Nicht-Template-Typ ändern, dh
struct Base {
struct nested;
};
...
typedef Derived3::nested xxx;
dann funktioniert es mit den oben genannten Compilern. ändert nichts
[Bearbeiten] Ändern der nested
Template-Struktur zu einer Vorlage alias auch;
template <typename> struct dependent { struct type; };
struct Base {
template <typename T>
using nested = typename dependent<T>::type;
};
erzeugt die gleichen Ergebnisse mit den oben genannten Compiler. [end bearbeiten]
Von N3242 §10.1 [class.mi]
Eine Klasse kann eine indirekte Basisklasse mehr als einmal sein und kann eine direkte und eine indirekte Basisklasse sein. Es gibt begrenzte Dinge, die mit solch einer Klasse gemacht werden können. Auf die nicht statischen Datenelemente und Elementfunktionen der direkten Basisklasse kann nicht im Bereich der abgeleiteten Klasse verwiesen werden. Auf die statischen Elemente, Aufzählungen und Typen kann jedoch eindeutig Bezug genommen werden.
ich denke, es bedeutet, dass der Code gültig sein sollte, aber ich bin mir nicht sicher.
Ich suchte nach dem [bug report] (https://bugs.llvm.org/show_bug.cgi?id=17929) (id 17929), das vom OP gefüllt wurde, da der Bug (?) Immer noch in clang 5.0 auftaucht .1. Leider gab es keine Antworten. – Caninonos