hva er den type decltype (funksjon) og hvorfor jeg ikke trenger "konst" kvalifiseringskamp her?

stemmer
2

Jeg er forvirret av den typen decltypeen funksjon. Det er heller ikke en funksjon peker eller funktor. Hvordan kan jeg bruke det? Og hvorfor hele malen spesialisering her krever ikke constkvalifiseringskamp.

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)
{}

hvis jeg fjerner &, så klager det som

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

Se, det decltype(std::hex)er i parameterfeltet trekkes til std::ios_base& (*)(std::ios_base&), mens det trekkes til std::ios_base&(std::ios_base&)i parameter av malen.

Kan du hjelpe meg å forstå det?

Publisert på 02/12/2019 klokken 23:56
kilden bruker
På andre språk...                            


2 svar

stemmer
2

std::hexer en funksjon, med den følgende erklæring (se cppreference ):

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

Hvis Ter den typen denne funksjonen, nemlig std::ios_base&(std::ios_base&), så fordi det er en funksjonstype, const Ter det samme som T. Dette er grunnen til den eksplisitte oppretting definisjonen kan skrives uten const.

Legg merke til at hvis man fjerner den &fra den eksplisitte oppretting definisjon, og deretter funksjonen parametertype decltype(std::hex)gjennomgår standard transformasjonen fra et funksjonstypen til en funksjon peker type. Det er derfor du ser (*)i feilmeldingen.

Svarte 03/12/2019 kl. 00:02
kilden bruker

stemmer
0

For å sitere standard :

Effekten av en cv-kvalifiserings-seq i en funksjon declarator er ikke det samme som å legge til cv-kvalifisering på toppen av den funksjonstype. I det sistnevnte tilfelle er de cv-kvalifiseringer ignoreres. [Merk: En funksjon type som har en cv-kvalifiseringskamp-seq er ikke en cv-kvalifisert type; det er ingen cv-kvalifisert funksjonstyper. - end note] [Eksempel:

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

- end eksempel]

Svarte 03/12/2019 kl. 00:11
kilden bruker

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