Si intenta imaginar lo que hace el compilador para implementar las funciones inline, puede confundirse pensando que hay más limitaciones que las que existen realmente. En concreto, si una inline hace una referencia adelantada 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 llamara a f(), tendría un conjunto de llamadas recursivas, que son demasiado complicadas para que el compilador pueda hacerlas inline. (Además, tendría que efectuar alguna comprobación en f() o g() para forzar en alguna de ellas un caso base, o la recursión será infinita).