was ist die Art der decltype (Funktion) und warum ich brauche „const“ nicht hier Qualifier?

stimmen
2

Ich bin von der Art der zu verwechseln decltypeFunktion. Es ist weder ein Funktionszeiger noch Funktors. Wie kann ich es nutzen? Und warum die vollständige Vorlage Spezialisierung hier erfordert keinen constQualifier.

class SomeClass
{
public:
    template <typename T>
    void insideTemplateMethod(const T & value)
    {
    }
};
template
void SomeClass::insideTemplateMethod<decltype(std::hex)>(decltype(std::hex) & ); // no need to specify const

template
void SomeClass::insideTemplateMethod<int>(int &); // error, must specify const

int main(void)
{}

wenn ich das entfernen &, es beschwert sich dann , dass

error: template-id 'insideTemplateMethod<std::ios_base&(std::ios_base&)>' for 'void SomeClass::insideTemplateMethod(std::ios_base& (*)(std::ios_base&))' does not match any template declaration

Schauen Sie , die decltype(std::hex)im Parameterfeld abgezogen std::ios_base& (*)(std::ios_base&), während es abgezogen wird std::ios_base&(std::ios_base&)im Parameter der Vorlage.

Könnten Sie mir helfen, es zu verstehen bitte?

Veröffentlicht am 02/12/2019 um 23:56
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
2

std::hexist eine Funktion, mit der folgenden Erklärung (siehe cppreference ):

std::ios_base& hex( std::ios_base& str );

Wenn Tdie Art dieser Funktion ist, nämlich std::ios_base&(std::ios_base&)dann , weil es sich um eine Funktionstyp ist, const Tist die gleiche wie T. Aus diesem Grund kann die explizite Instanziierung Definition ohne die geschrieben werden const.

Beachten Sie, dass , wenn Sie das Entfernen &von der expliziten Instanziierung Definition, dann wird der Funktionsparameter Typ decltype(std::hex)erfährt die Standard - Transformation von einer Funktion auf eine Funktion Zeigertyp. Aus diesem Grund Sie sehen (*)in der Fehlermeldung.

Beantwortet am 03/12/2019 um 00:02
quelle vom benutzer

stimmen
0

Zu zitieren den Standard :

Die Wirkung eines CV-Qualifier-seq in Abhängigkeit declarator ist nicht das gleiche wie das Hinzufügen cv-Qualifikation auf den Funktionstyp. Im letzteren Fall wird der cv-Qualifier werden ignoriert. [Anmerkung: Eine Funktion , die einen Typ hat cv-Qualifier-seq ist kein cv qualifizierte Typ; es gibt keine cv-qualifizierte Funktionstypen. - Endnote] [Beispiel:

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

- Ende Beispiel]

Beantwortet am 03/12/2019 um 00:11
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more