Ошибка при использовании constexpr в качестве параметра шаблона в тот же класс

Если я попытаюсь скомпилировать следующий код 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 говорится, что он неправильный?

6
задан CesarB 12 November 2011 в 23:20
поделиться