Posso usar o resultado de um operador de conversão C ++ 17 lambda constexpr captureless como argumento de tipo de modelo de ponteiro de função?

Ao responderComo escrevo uma expressão lambda que se parece com um método?, Tentei transformar um lambda sem captura em um ponteiro de função de membro explorando o fato de que, desde C ++ 17, as lambdas sem captura têm umconstexpr operador de conversão para seu tipo de ponteiro de função.

Então, eu vim com um problema que se resumia a:

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

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

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

Agora, isso compila no clang (desde 5.0.0), mas o gcc (> = 7.2) reclama:

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

A questão é,quem esta certo?

questionAnswers(1)

yourAnswerToTheQuestion