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 asnamespaceariá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?

questionAnswers(1)

yourAnswerToTheQuestion