quel est le type de decltype (fonction) et pourquoi je ne qualificateur pas besoin « const » ici?

voix
2

Je suis confus du type de decltypefonction. Il est ni un pointeur de fonction ni foncteur. Comment puis - je utiliser? Et pourquoi la spécialisation complète du modèle ne nécessite pas ici de constqualification.

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

si je retire la &, il se plaint alors que

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

Regardez, le decltype(std::hex)dans le champ paramètre est déduit à std::ios_base& (*)(std::ios_base&), alors qu'il est déduit de std::ios_base&(std::ios_base&)dans le paramètre du modèle.

Pourriez-vous me aider à comprendre ce?

Créé 02/12/2019 à 23:56
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
2

std::hexest une fonction, avec la déclaration suivante (voir cppreference ):

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

Si Test le type de cette fonction, à savoir std::ios_base&(std::ios_base&), ensuite parce qu'il est un type de fonction, const Test le même que T. Ceci est la raison pour laquelle la définition explicite de l' instanciation peut être écrit sans const.

Notez que si vous supprimez la &de la définition explicite de l' instanciation, le type de paramètre de fonction decltype(std::hex)subit la transformation standard d'un type de fonction à un type de pointeur de fonction. Voilà pourquoi vous voyez (*)dans le message d'erreur.

Créé 03/12/2019 à 00:02
source utilisateur

voix
0

Pour citer la norme :

L'effet d'un cv qualificateur-seq dans un déclarateur de fonction ne sont pas la même que l' ajout cv-qualification sur le dessus du type de fonction. Dans ce dernier cas, les qualificatifs de cv- sont ignorés. [Note: Un type de fonction qui a un cv-qualifié-seq est pas un cv qualifié de type; il n'y a pas de cv qualifié types de fonction. - Note de fin] [Exemple:

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

- exemple final]

Créé 03/12/2019 à 00:11
source utilisateur

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