Если я попытаюсь скомпилировать следующий код C ++ 0x, я получаю сообщение об ошибке:
template<int n> struct foo { };
struct bar {
static constexpr int number() { return 256; }
void function(foo<number()> &);
};
В gcc 4.6.1 сообщение об ошибке:
test.cc:6:27: error: ‘static constexpr int bar::number()’ used before its definition
test.cc:6:28: note: in template argument for type ‘int’
При использовании clang 2.8 появляется сообщение об ошибке:
test.cc:6:20: error: non-type template argument of type 'int' is not an integral
constant expression
void function(foo<number()> &);
^~~~~~~~
1 error generated.
Если я перемещаю функцию constexpr
в базовый класс, она работает с gcc и выдает такое же сообщение об ошибке на clang:
template<int n> struct foo { };
struct base {
static constexpr int number() { return 256; }
};
struct bar : base {
void function(foo<number()> &);
};
Это код неправильно, или это ограничение или ошибка в реализации C ++ 0x в gcc 4.6? Если код неправильный, почему он неправильный и в каких пунктах стандарта C ++ 11 говорится, что он неправильный?