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?