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").
constexpr
constructor como una etapa intermedia antes de transformar el objeto en construcción en el estado final que puede almacenarse en unconstexpr
¿variable?