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).