Variable `constexpr`“ utilizada en su propio inicializador ”: Clang vs. GCC

Esta pregunta parece estar relacionada conuno existente, pero no entiendo la "solución portátil" proporcionada enla respuesta allí (involucrandoconst auto this_ = this;) y, además, creo que el siguiente ejemplo es más fácil de seguir.

Estoy jugando con el siguiente fragmento de código C ++ 17 (demo en 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;
}

La compilación falla con GCC 7.2 mientras que Clang 5.0.0 no ve ningún problema. El error de GCC esencialmente lee

error: el valor de 'bar' no se puede usar en una expresión constante

nota: 'bar' usado en su propio inicializador

Estoy aún más confundido después de darme cuenta de que eliminar la finalprint_constexpr_char hace que el código se compile aunque todavía contiene la líneaconstexpr auto bar = Test{foo}; de qué GCC solía quejarse ("usado en su propio inicializador").

¿Qué compilador es correcto aquí?¿Cómo entender la nota de GCC (si no es un error) que "usar en su propio inicializador" es dañino si el resultado se usa posteriormente en una expresión constante?¿Hay una forma / solución válida para usar punteros en unconstexpr constructor como una etapa intermedia antes de transformar el objeto en construcción en el estado final que puede almacenarse en unconstexpr ¿variable?

Respuestas a la pregunta(1)

Su respuesta a la pregunta