struct Foo
{
struct Bar
{
int data = 0;
//constexpr Bar() = default; // Doesn't work either
constexpr Bar() : data(0) {}
};
static constexpr Bar bar = {}; // ERROR
//static constexpr Bar bar = {0}; // Works if the ctor from Bar is removed
};
Clang e GCC (com std=c++20) dizem que o construtor que estou tentando usar é indefinido. Mas funciona se eu mudar constexpr
para inline
. Gostaria de entender o que há de errado em usar 'contexpr'.
O compilador analisa uma classe em duas passagens. A primeira passagem lida com variáveis de membro e declarações de função , e a segunda passagem lida com corpos de função , que é o que permite usar uma variável de membro (ou função) declarada abaixo de uma função nessa função.
Quando as classes são aninhadas, a primeira passagem percorre toda a classe mais externa (incluindo todas as classes aninhadas) e, da mesma forma, a segunda passagem percorre toda a classe mais externa (incluindo as aninhadas).
Aparentemente, a inicialização da variável estática acontece durante a primeira passagem. Se não for
constexpr
(inline
), então ver uma declaração do construtor é suficiente. Mas se forconstexpr
, então a definição do construtor também precisa ser vista (para calcular imediatamente o valor), mas não está disponível durante a primeira passagem.E quando você se livra do construtor e do
= {0}
, isso é a inicialização agregada , que não usa nenhum construtor e, portanto, pode funcionar durante a primeira passagem.