18

In diesem Beispiel:In using-declaration können abhängige Namen nach Templatesubstitution für Konstruktoren gerendert werden?

template<class T> 
struct S : T 
{ 
    using T::X; 
}; 

T::X ist ein Name, der abhängig XT in dem Element verweist. Wenn S<T> mit T = X instanziiert:

struct X 
{ 
    X(int) {} 
}; 
... 
S<X> s(42); 

Wird die using-Deklaration werden vererben-Konstruktor?

Clang lehnt den Code DEMO ab, während g ++ das akzeptiert.

Beachten Sie, dass, wenn wir schreiben:

using T::X::X; 

Beide Compiler den Code und behandeln es als Vererbungs-Konstruktor akzeptieren. Darf using T::X standardmäßig zum Erben-Konstruktor werden?

Antwort

4

Dank T.C. zum Hinweis:

Core issue 2070, die in der Entwurfsphase ist (es ist bestätigt, ein Problem zu sein, und der Wortlaut der Lösung wird bearbeitet), befasst sich mit diesem Fall. Das vorgeschlagene Update erfordert, dass beide IDs die gleiche ID aufweisen, damit dieser Code als ererbender Konstruktor akzeptiert wird.

In diesem Licht macht die Fehlermeldung von clang Sinn, da T :: X der Typ X sein würde, der den Fehler "type from template ohne typename tag" auslöst.

Original-Beitrag:

So scheint es mir, dass die eigentliche Frage ist: „Ist es zulässig, dass eine Vorlage Instanziierung die semantische Bedeutung einer using-Anweisung ändert?“

Und die Antwort ist, es ist nicht verboten. Ich weiß nicht, ob diese Interaktion von den Autoren des Standards vorhergesehen und beabsichtigt wurde. Aber soweit ich sehen kann, ist sowohl die using-Deklaration in Abschnitt 10 als auch die Template-Initialisierung in Abschnitt 17 durch den Buchstaben des Standards zulässig, ja, using T::X ist zulässig, und ja, die using-Deklaration wird zu einem erbenden Konstruktor, wenn T ist X.

+4

Siehe [Kernproblem 2070] (https://wg21.link/CWG2070). –

+0

Vielen Dank, antworten aktualisiert. – OmnipotentEntity

Verwandte Themen