2017-06-26 10 views
6

std::is_function ist für Typen spezialisiert, die Signatur ähnelt:Welcher Typ ist int (int) & oder int (int) const &?

int(int) & 

siehe hier: std::is_function

Aber das ist weder ein Zeiger auf eine Member-Methode könnte die Unterschrift sein:

int(T::*)(int) & 

Es kann auch eine Referenz auf eine Funktion sein:

int (&)(int) 

Was ist das für eine merkwürdige Signatur?

Antwort

13

Es handelt sich um einen Funktionstyp, der nur im Typsystem existiert. Es kann niemals erstellt werden.

Aber das ist weder ein Zeiger auf ein Element-Methode, die Unterschrift sein könnte:

int(T::*)(int) & 

Es ist dies, ohne den Zeiger. Das Typsystem ermöglicht es Ihnen, dies als einen Typ zu beschreiben.

#include <type_traits> 

struct T { }; 
using A = int(int) &; 
using B = A T::*; 
using C = int(T::*)(int) &; 

static_assert(std::is_same_v<B, C>); 

@ T.C. Erwähnungen PR0172R0, die diskutiert, wie die Anwesenheit dieser Typen Probleme für Bibliotheksautoren verursacht, und schlägt mehrere Optionen vor, die diese Probleme reduzieren könnten. Eine der Optionen ist, sie vollständig zu beseitigen, andere reduzieren deren Auswirkungen. Abhängig davon, wie das geht, ist diese Antwort möglicherweise für zukünftige Versionen von C++ korrekt oder nicht korrekt.

+3

Ich würde auf die schöne Zusammenfassung in [P0172R0] verlinken (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0172r0.html). –

+0

@ T.C. Danke, fügte eine Erwähnung hinzu. – hvd

+3

Ich glaube, Sie können auch 'mit A = int (int) &; Struktur Bob {A foo; }; '. – Yakk

6

Auf der Dokumentationsseite Sie verknüpfen, werden Sie diesen Kommentar sehen:

// specialization for function types that have ref-qualifiers 

über der Liste der Beispiele du herkommst Referenz.

Das sind Funktionen mit ref-Qualifiers, die Sie mehr über here lesen können.

Kurz gesagt, sind sie const qualifizierte Funktionen ähnlich. Hier ist ein Beispiel:

Ich kann nicht einen großen Anwendungsfall für diese Funktion vorstellen, aber es ist möglich zu verwenden.

+1

[Hier] (https://github.com/dropbox/nn/blob/master/nn.hpp#L83) ist ein Anwendungsbeispiel;) –

5

Seit Beginn der Zeiten (bezogen auf den ersten C++ Standard) Sie solche „fremde“ Funktionstypen wie zum Beispiel

typedef int F() const; 

Trotz der Tatsache, dass die obige Erklärung aller Klassen beinhaltet nicht sofort erklären könnten Das nachfolgende const kann in diesem Fall nur als Const-Qualifizierung einer nicht statischen Klassenmemberfunktion dienen. Dies beschränkt die Verwendung des obigen typedef-Namens auf Klassenmitgliedsdeklarationen. Zum Beispiel könnte man es verwenden, wie

struct S { 
    F foo;    // Declares an `int S::foo() const` member function 
}; 

int S::foo() const { // Defines it 
    return 42; 
} 

F S::*p = &S::foo; // Declares 'p' as `int (S::*)() const` pointer 

Hinweis folgt, dass jedoch unklar, ist dies eine „klassische“ C++ Funktion, die in der Sprache für eine lange Zeit gewesen ist.

Was Sie in Ihrem Beispiel haben, ist effektiv die gleiche Sache, aber mit C++ 11 ref-qualifier anstelle von const Qualifier.

Verwandte Themen