constexpr inicializando membro estático usando a função estática

Requisitos

eu quero umconstexpr valor (ou seja, uma constante de tempo de compilação) computadoconstexpr função. E quero que ambos tenham um escopo para o namespace de uma classe, ou seja, um método estático e um membro estático da classe.

Primeira tentativa

Eu escrevi isso pela primeira vez (para mim) de maneira óbvia:

class C1 {
  constexpr static int foo(int x) { return x + 1; }
  constexpr static int bar = foo(sizeof(int));
};

g++-4.5.3 -std=gnu++0x diz para isso:

error: ‘static int C1::foo(int)’ cannot appear in a constant-expression
error: a function call cannot appear in a constant-expression

g++-4.6.3 -std=gnu++0x reclama:

error: field initializer is not constant
Segunda tentativa

OK, pensei, talvez tenha que tirar as coisas do corpo da turma. Então eu tentei o seguinte:

class C2 {
  constexpr static int foo(int x) { return x + 1; }
  constexpr static int bar;
};
constexpr int C2::bar = C2::foo(sizeof(int));

g++-4.5.3 irá compilar isso sem queixas. Infelizmente, meu outro código usa alguns baseados em intervalosfor loops, então eu tenho que ter pelo menos 4.6. Agora que eu olho mais de pertolista de suporte, parece queconstexpr também exigiria 4.6. E comg++-4.6.3 eu recebo

3:24: error: constexpr static data member ‘bar’ must have an initializer
5:19: error: redeclaration ‘C2::bar’ differs in ‘constexpr’
3:24: error: from previous declaration ‘C2::bar’
5:19: error: ‘C2::bar’ declared ‘constexpr’ outside its class
5:19: error: declaration of ‘const int C2::bar’ outside of class is not definition [-fpermissive]

Isso parece muito estranho para mim. Como as coisas "diferem emconstexpr" Aqui? Não tenho vontade de adicionar-fpermissive como eu prefiro que meu outro código seja verificado de forma rigurosa. Mover ofoo a implementação fora do corpo da turma não teve efeito visível.

Respostas esperadas

Alguém pode explicar o que está acontecendo aqui? Como posso conseguir o que estou tentando fazer? Estou interessado principalmente em respostas dos seguintes tipos:

Uma maneira de fazer isso funcionar no gcc-4.6Uma observação de que versões posteriores do gcc podem lidar corretamente com uma das versõesUm ponteiro para a especificação de acordo com o qual pelo menos uma das minhas construçõesdevemos trabalho, para que eu possa aborrecer os desenvolvedores do gcc sobre como fazê-lo funcionarInformações de que o que eu quero é impossível de acordo com as especificações, de preferência com algum insigto quanto à lógica por trás desta restrição

Outras respostas úteis também são bem-vindas, mas talvez não sejam aceitas tão facilmente.

questionAnswers(4)

yourAnswerToTheQuestion