2013-03-23 16 views
9

Was ist die tatsächliche Wirkung des folgenden Konstrukts:Auswirkungen einer konst Basisklasse

class Base { /* ... */ }; 

template<class T> 
class Derived : public T { /* ... */ }; 

int main() { 
    Derived<const Base> d; 
    // ... 
} 

Ist die Derived Klasse nur Zugriff auf die const -Teil der Schnittstelle von Base hat? Meine ersten Tests zeigen, dass es überhaupt keinen Effekt gibt. Warum?

Danke!

+0

Ich denke, dass die Antwort ist hier: http://stackoverflow.com/a/13435319/945183 –

+0

denke ich, diese Fragen auf verschiedene Dinge beziehen: Die verknüpften diejenigen sind über Vorlage * Erklärungen * des form 'template struct test;' und meine Frage bezieht sich auf Template * Instanziierungen *, deren angewendete Parameter 'const' Typen sind. – phlipsy

Antwort

2

Meine Vermutung ist, dass die const ignoriert wird, weil, wenn Sie versuchen, doesn't compile

class Derived : public const Base 

das Programm zu schreiben.

EDIT:

frozenkoi gab den relevanten Teil des Standard in den Kommentaren:

„Ein typedef-name (7.1.3) mit dem Namen eines Klassentyp oder einem CV- Eine qualifizierte Version davon ist ebenfalls ein Klassenname.Wenn ein typedef-name, der einen cv-qualifizierten Klassentyp bezeichnet, verwendet wird, wenn ein Klassenname erforderlich ist, werden die cv-Qualifikationsmerkmale ignoriert. Ein typedef-name darf nicht als verwendet werden die Kennung in einem Klassenkopf. " §9.1

+0

Sie haben Recht, Sie können es nicht explizit schreiben. Ich denke, es ist wie 'void func() {return void(); } '- es explizit schreiben ist völlig nutzlos, aber im Kontext von Templates wichtig als Eckfall. – phlipsy

+0

Ich denke, es hat mehr damit zu tun, dass "const" ignoriert wird, wenn der Typ deklariert wird als in der Klassendeklaration ignoriert wird. (kein C++ - Standard zur Hand), aber es ist in etwa so: "Die Top-Level-CV-Qualifier auf dem Template-Parameter werden ignoriert, wenn man ihren Typ bestimmt" §14 – frozenkoi

+1

Ich bin nicht überzeugt, weil das nur ein Syntaxproblem ist; dies kompiliert: http://ideone.com/ik41t3 –

Verwandte Themen