No arcaico C e C ++, inlineé como register: uma sugestão (nada mais que uma sugestão) para o compilador sobre uma possível otimização.
No C ++ moderno, inlineinforma ao vinculador que, se várias definições (não declarações) forem encontradas em diferentes unidades de conversão, elas serão iguais e o vinculador poderá manter uma livremente e descartar todas as outras.
inline é obrigatório se uma função (não importa quão complexa ou "linear") for definida em um arquivo de cabeçalho, para permitir que várias fontes a incluam sem obter um erro de "definição múltipla" pelo vinculador.
As funções de membro definidas dentro de uma classe são "inline" por padrão, assim como as funções de modelo (em contraste com as funções globais).
//fileA.h
inline void afunc()
{ std::cout << "this is afunc" << std::endl; }
//file1.cpp
#include "fileA.h"
void acall()
{ afunc(); }
//main.cpp
#include "fileA.h"
void acall();
int main()
{
afunc();
acall();
}
//output
this is afunc
this is afunc
Observe a inclusão de fileA.h em dois arquivos .cpp, resultando em duas instâncias de afunc(). O vinculador descartará um deles. Se não inlinefor especificado, o vinculador irá reclamar.