39 votes

Pourquoi la déduction de type de retour automatique fonctionne-t-elle avec des types non complètement définis?

Considérez les points suivants:

template<typename Der>
struct Base {
    // NOTE: if I replace the decltype(...) below with auto, code compiles
    decltype(&Der::operator()) getCallOperator() const {
        return &Der::operator();
    }
};

struct Foo : Base<Foo> {
    double operator()(int, int) const {
        return 0.0;
    }
};

int main() {
    Foo f;
    auto callOp = f.getCallOperator();
}

Je veux créer une fonction membre dans le PROGRAMME de la classe de base avec un type de retour en fonction de la signature de l' operator() dans la classe dérivée. Toutefois decltype(&Der::operator()) ne parvient pas à compiler, et L' operator() fonction membre en Foo n'est pas visible. Je suppose que c'est parce que la classe de base modèle est instancié avant d' Foo est entièrement défini.

Étonnamment, si je place l' auto pour le type de retour, il compile. J'ai supposé qu' auto rendrait le compilateur en déduire le type de retour de la fonction du corps et de l'échec parce que le corps utilise la pas entièrement définis Foo type.

Ce comportement est le même pour les deux MSVC 2015.3 et Clang 3.8

Pourquoi le code de commencer à travailler avec auto? N' auto type de déduction en quelque sorte le "retard" de l'instanciation? Ou utiliser un autre contexte qu'un écrit à la main type de retour de l'expression?

24voto

Sebastian Redl Points 18816

Votre supposition est correcte. Une déduit le type de retour n'est pas réellement en déduire jusqu'à la signature de la fonction est nécessaire. Cela signifie qu'il sera déduit dans le cadre de l'appel à getCallOperator, à quel point Foo est entièrement défini.

Ceci est spécifié dans 7.1.6.4p12:

Le type de retour de la déduction pour un modèle de fonction avec un espace réservé dans son type déclaré se produit lorsque la définition est instancié, même si le corps de la fonction contient une instruction de retour avec un non-dépendant du type de l'opérande.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X