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").

Qual compilador está correto aqui?Como entender a nota do GCC (se não um bug) de que "usar em seu próprio inicializador" é prejudicial se o resultado for subsequentemente usado em uma expressão constante?Existe uma maneira / solução válida para usar ponteiros em umconstexpr 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?

questionAnswers(1)

yourAnswerToTheQuestion