g ++ trata literal de string retornada como ponteiro const char e não matriz char char

Estou vendo algum comportamento estranho ao retornar uma string literal de uma função que deve executar uma conversão implícita com o g ++ (versão 4.7.3). Alguém pode explicar por que o seguinte código:

#include <stdio.h>

class Test
{
public:
  template <unsigned int N>
  Test(const char (&foo)[N])
  {
    printf("Template const char array constructor\n");
  }

  Test(char* foo)
  {
    printf("char* constructor\n");
  }
};

Test fn()
{
  return "foo";
}

int main()
{
  Test t("bar");
  Test u = fn();

  return 0;
}

produz o resultado:

Template const char array constructor
char* constructor

em g ++? O surpreendente é que o construtor char * seja escolhido de preferência ao construtor const char array ao gerar o valor de retorno de fn (). É certo que há um aviso, "conversão descontinuada da constante da string para 'char *'"

Ainda mais surpreendentemente, se você remover o construtor char *, o código não será compilado com o g ++.

Funciona como esperado com o clang (construtor Template usado nas duas vezes), o que me faz pensar que esse é um bug do compilador, mas talvez seja apenas um canto estranho da especificação do C ++ - alguém poderia confirmar?

questionAnswers(2)

yourAnswerToTheQuestion