qual è il tipo di decltype (funzione) e il motivo per cui non ho bisogno "const" qualificatore qui?

voti
2

Sono confuso del tipo di decltypeuna funzione. Non è né un puntatore alla funzione né functor. Come posso usarlo? E perché il modello di specializzazione completo qui non richiede constqualificazione.

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

se mi tolgo la &, poi si lamenta che

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

Guarda, il decltype(std::hex)campo nel parametro viene dedotto a std::ios_base& (*)(std::ios_base&), mentre è dedotta al std::ios_base&(std::ios_base&)nel parametro del modello.

La prego di aiutarmi a capire che?

È pubblicato 02/12/2019 alle 23:56
fonte dall'utente
In altre lingue...                            


2 risposte

voti
2

std::hexè una funzione, con la seguente dichiarazione (vedi cppreference ):

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

Se Tè il tipo di questa funzione, vale a dire std::ios_base&(std::ios_base&), allora perché è un tipo di funzione, const Tè la stessa T. Questo è il motivo per cui la definizione esplicita di istanza può essere scritto senza il const.

Si noti che se si rimuove il &dalla definizione esplicita di istanza, quindi il tipo di parametro funzione di decltype(std::hex)subisce la trasformazione standard da un tipo di funzione a un tipo di puntatore a funzione. Questo è il motivo per cui si sta vedendo (*)nel messaggio di errore.

Risposto il 03/12/2019 a 00:02
fonte dall'utente

voti
0

Per citare lo standard :

L'effetto di un cv-qualificazione-seq in funzione dichiaratore non è la stessa come l'aggiunta cv-qualificazione in cima al tipo di funzione. In quest'ultimo caso, i CV-qualificazioni vengono ignorati. [Nota: Un tipo di funzione che ha un cv-qualificazione-seq non è un cv qualificato tipo; non ci sono cv-qualificati tipi di funzione. - nota end] [Esempio:

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

- Esempio end]

Risposto il 03/12/2019 a 00:11
fonte dall'utente

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