Variável `constexpr`“ usada em seu próprio inicializador ”: Clang vs. GCC
Esta pergunta parece relacionada aum existente, mas não entendo a "solução portátil" fornecida ema resposta lá (envolvendoconst auto this_ = this;
) e, além disso, acho que o exemplo a seguir é mais fácil de seguir.
Estou brincando com o seguinte trecho de código C ++ 17 (demonstração ao vivo):
#include <iostream>
struct Test {
const char* name_{nullptr};
const Test* src_{nullptr};
constexpr Test(const char* name) noexcept
: name_{name}
{}
constexpr Test(const Test& src) noexcept
: src_{&src}
{
name_ = src_->name_;
src_ = nullptr;
}
};
template<char c>
void print_constexpr_char() {
std::cout << c << std::endl;
}
int main() {
constexpr const char* in = "x";
constexpr auto foo = Test{in};
constexpr auto bar = Test{foo};
std::cout << bar.name_ << std::endl;
print_constexpr_char<bar.name_[0]>();
return 0;
}
A compilação falha com o GCC 7.2, enquanto o Clang 5.0.0 não apresenta nenhum problema. O erro do GCC basicamente lê
erro: o valor de 'bar' não é utilizável em uma expressão constante
note: 'bar' usado em seu próprio inicializador
Estou ainda mais confuso depois de perceber que remover a finalprint_constexpr_char
faz o código compilar, embora ainda contenha a linhaconstexpr auto bar = Test{foo};
sobre o qual o GCC costumava reclamar ("usado em seu próprio inicializador").
constexpr
construtor como um estágio intermediário antes de transformar o objeto em construção no estado final que pode ser armazenado em umconstexpr
variável?