2016-08-08 19 views
20

Angenommen, wir konstante Elementfunktion über typedef erklären möchten:Konst Memberfunktion und typedef, C++

typedef int FC() const; 
typedef int F(); 

struct A 
{ 
    FC fc;   // fine, we have 'int fc() const' 
    const F fc; // not fine, 'const' is ignored, so we have 'int fc()' 
}; 

Da const ignoriert das Programm kompiliert in Ordnung. Warum wird const für die Funktion ignoriert? Da wir Const Pointer auf diese Weise bilden können, ist das einzige, was ich mir vorstellen kann, "C-Erbe". Sagt der Standard etwas darüber?

+0

'int() const' ist meistens ein halber Typ, da er nur auf Klassen angewendet werden kann, um Memberfunktionen zu haben. – Jarod42

+0

Es kann nicht "C-Erbe" sein, da C keine Mitgliedsfunktionen hat. – Jarod42

+0

Ja, aber in C können wir noch haben: typedef int F(); const F f; obwohl 'int f() const' syntaktisch falsch sein kann. – igntec

Antwort

19

C++ 14 Standard, [dcl.fct] pt. 7:

Die Wirkung eines CV-Qualifier-seq in Abhängigkeit declarator ist nicht die gleiche cv-Qualifikation auf des Funktionstypen als Zugabe. Im letzteren Fall werden die cv-Qualifikationsmerkmale ignoriert. [Hinweis: Ein Funktionstyp mit einem cv-qualifier-seq ist kein cv-qualifizierter Typ; Es gibt keine cv-qualifizierten Funktionstypen. - Endnote]

Beispiel:

typedef void F(); 

struct S { 
    const F f; // OK: equivalent to: void f(); 
}; 

Also, das ist ein richtiges Verhalten.

2

Diese Änderung wird durch CWG 295 vorgenommen, um die generische Programmierung zu vereinfachen. Bedenken Sie:

template<class F> 
void meow(const F& f) { f(); } 
void purr(); 

meow(purr); 

Ignorieren der zusätzlichen const ermöglicht dies funktioniert.