constexpr инициализирует статический член с помощью статической функции
я хочуconstexpr
значение (то есть константа времени компиляции), вычисленное изconstexpr
функция. И я хочу, чтобы оба из них были ограничены пространством имен класса, то есть статическим методом и статическим членом класса.
Я сначала написал это (для меня) очевидным способом:
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
реализация вне тела класса не имела видимого эффекта.
Может кто-нибудь объяснить, что здесь происходит? Как мне добиться того, что я пытаюсь сделать? Меня в основном интересуют ответы следующих видов:
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Другие полезные ответы также приветствуются, но, возможно, не будут приняты так же легко.