Considere o arquivo de cabeçalho:
class T
{
private:
int const ID;
public:
explicit T(int const ID_) noexcept : ID(ID_) {}
int GetID() const noexcept { return ID; }
};
ou alternativamente:
class T
{
private:
int const ID;
public:
explicit T(int const ID_) noexcept;
int GetID() const noexcept;
};
inline T::T(int const ID_) noexcept : ID(ID_) {}
inline int T::GetID() const noexcept { return ID; }
Em um mundo de pré-módulos, esses cabeçalhos podem ser textualmente incluídos em várias TU sem violações de ODR. Além disso, como as funções-membro envolvidas são relativamente pequenas, o compilador provavelmente "inline" (evita chamadas de função ao usar) essas funções ou até otimiza algumas instâncias T
.
Em um relatório recente sobre a reunião em que o C ++ 20 foi concluído, pude ler a seguinte declaração:
Esclarecemos o significado das
inline
interfaces do módulo: a intenção é que os corpos de funções que não são declarados explicitamenteinline
não façam parte da ABI de um módulo, mesmo que esses corpos de função apareçam na interface do módulo. Para dar aos autores do módulo mais controle sobre sua ABI, as funções-membro definidas nos corpos das classes nas interfaces dos módulos não são mais implícitasinline
.
Não tenho certeza se não estou enganado. Isso significa que, em um mundo de módulos, para que o compilador seja capaz de otimizar chamadas de funções ausentes, precisamos anotá-las como inline
se fossem definidas em classe?
Em caso afirmativo, a seguinte interface do módulo seria equivalente aos cabeçalhos acima?
export module M;
export
class T
{
private:
int const ID;
public:
inline explicit T(int const ID_) noexcept : ID(ID_) {}
inline int GetID() const noexcept { return ID; }
};
Mesmo que eu ainda não tenha um compilador com suporte para módulos, gostaria de começar a usá- inline
lo quando apropriado, para minimizar a refatoração futura.
inline
palavra - chave nunca será incorporada pelo compilador, correto?