s variáveis `const 'e` constexpr` nos cabeçalhos devem estar `inline` para evitar violações de ODR?
Considere o seguinte cabeçalho e assuma que ele seja usado em várias TUs:
static int x = 0;
struct A {
A() {
++x;
printf("%d\n", x);
}
};
Comoessa questã explica, isso é uma violação do ODR e, portanto, do U
Agora, não há violação ODR se o nossoinline
função @ refere-se a uma função nãovolatile
const
object e nós não o usamos dentro dessa função (mais as outras provisões), portanto isso ainda funciona bem em um cabeçalho:
constexpr int x = 1;
struct A {
A() {
printf("%d\n", x);
}
};
Mas se acontecermos de usá-lo, estamos de volta à estaca zero com o UB:
constexpr int x = 1;
struct A {
A() {
printf("%p\n", &x);
}
};
Assim, dado que temos agorainline
variáveis, a diretriz não deve ser marcar todas asnamespace
ariáveis com escopo @ comoinline
nos cabeçalhos para evitar todos os problemas?
constexpr inline int x = 1;
struct A {
A() {
printf("%p\n", &x);
}
};
Isso também parece mais fácil de ensinar, porque podemos simplesmente dizer "inline
tudo nos cabeçalhos "(ou seja, definições de função e variável), além de" neverstatic
nos cabeçalhos ".
Esse raciocínio está correto? Em caso afirmativo, existem desvantagens de marcar sempreconst
econstexpr
variáveis nos cabeçalhos comoinline
?