9.4.2. Referencias adelantadas

Si está imaginando que el compilador [FIXME: is doing to implement inlines], puede confundirse pensando que hay más limitaciones que las que existen realmente. En concreto, si una inline hace una referencia adelanta a una función que no ha sido declarada aún en la clase (sea inline o no), puede parecer que el compilador no sabrá tratarla.

//: C09:EvaluationOrder.cpp
// Inline evaluation order

class Forward {
  int i;
public:
  Forward() : i(0) {}
  // Call to undeclared function:
  int f() const { return g() + 1; }
  int g() const { return i; }
};

int main() {
  Forward frwd;
  frwd.f();
} ///:~

Listado 9.13. C09/EvaluationOrder.cpp


En f(), se realiza una llamada a g(), aunque g() aún no ha sido declarada. Esto funciona porque la definición del lenguaje dice que las funciones inline en una clase no serán evaluadas hasta la llave de cierre de la declaración de clase.

Por supuesto, si g() a su vez llama a f(), tendrá un conjunto de llamadas recursivas, que son demasiado complicadas para el compilador pueda hacer inline. (También, tendrá que efectuar alguna comprobación en f() o g() para forzar en alguna de ellas un caso base, o la recursión será infinita).