My understanding is that inlining is done at compile time. However there is a linker stage part to it also.
Inlining is a "Request" to a Compiler. Which can be ignored.
When: When the function is too complicated.
Or when: Someone takes the address of the function (As the example you have given, is doing).
When someone takes the address of the function, then it means that the function has to occupy storage. And compiler does create the storage for it.
Then comes the issue of Inline functions being inside the header files which are included at many places.
It should lead to "Multiple Definition" error" at linking time.
But in this situation the Linker is "Told to ignore" the multiple definitions.
Source: Thinking in C++, Page 434, Last Paragraph.