constexpr инициализирует статический член с помощью статической функции

Requirements

я хочуconstexpr значение (то есть константа времени компиляции), вычисленное изconstexpr функция. И я хочу, чтобы оба из них были ограничены пространством имен класса, то есть статическим методом и статическим членом класса.

First attempt

Я сначала написал это (для меня) очевидным способом:

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 говорит на это:

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 жалуется:

error: field initializer is not constant
Second attempt

Хорошо, подумал я, возможно, мне нужно вывести вещи из класса. Поэтому я попробовал следующее:

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 скомпилирует это без нареканий. К сожалению, мой другой код использует некоторый диапазонfor петли, поэтому я должен иметь по крайней мере 4,6. Теперь, когда я смотрю ближе насписок поддержки, похоже, чтоconstexpr потребует также 4.6. И сg++-4.6.3 я получил

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]

Это звучит очень странно для меня. Чем отличаются вещи & # x201C;constexpr& # X201D; Вот? Я не хочу добавлять-fpermissive как я предпочитаю, чтобы мой другой код был тщательно проверен. Перемещениеfoo реализация вне тела класса не имела видимого эффекта.

Expected answers

Может кто-нибудь объяснить, что здесь происходит? Как мне добиться того, что я пытаюсь сделать? Меня в основном интересуют ответы следующих видов:

A way to make this work in gcc-4.6 An observation that later gcc versions can deal with one of the versions correctly A pointer to the spec according to which at least one of my constructs should work, so that I can bug the gcc developers about actually getting it to work Information that what I want is impossible according to the specs, preferrably with some insigt as to the rationale behind this restriction

Другие полезные ответы также приветствуются, но, возможно, не будут приняты так же легко.

Ответы на вопрос(4)

Ваш ответ на вопрос