¿Puedo usar el resultado de un operador de conversión lambda constexpr sin captura de C ++ 17 como un argumento sin tipo de plantilla de puntero de función?

Mientras contesta¿Cómo escribo una expresión lambda que se parece a un método?, Intenté convertir una lambda sin captura en un puntero de función miembro explotando el hecho de que, desde C ++ 17, las lambda sin captura tienen unconstexpr operador de conversión a su tipo de puntero de función.

Entonces se me ocurrió un problema que se reduce a:

template<void(*)()> struct A{};

int main()
{
  A<static_cast<void(*)()>([]{})>{}; // 1

  constexpr auto fp = static_cast<void(*)()>([]{});
  A<fp>{}; // 2
}

Ahora, esto se compila en clang (desde 5.0.0) pero gcc (> = 7.2) se queja:

error: lambda-expression in template-argument
   A<static_cast<void(*)()>([]{ /*whatever*/ })>{}; // 1
                            ^
error: 'main()::<lambda()>::_FUN' is not a valid template argument for type 'void (*)()' because 'static constexpr void main()::<lambda()>::_FUN()' has no linkage
   A<fp>{}; // 2

La pregunta es,quien tiene razon

Respuestas a la pregunta(1)

Su respuesta a la pregunta