Ошибка C ++ 0x с constexpr и возвращающей функцией шаблона

Я пытался найти решение проблемы вопроса Шаблон C ++ вывод типа параметра без типа , который не включает параметр шаблона для вызова f, но неявно выбирает правильный тип для параметра шаблона.

Поскольку constexpr должен гарантировать, что функция содержит только константы времени компиляции и оцениваются во время компиляции (по крайней мере, это то, что я думаю), я подумал, что это может быть решением этой проблемы. Итак, я придумал следующее:

template  void f() {}

//first i tried this:
template  auto get_f(T t) -> decltype( &f ) { return f; }

//second try:
template  constexpr void (&get_f( T t ))()  { return f; }

int main()
{
    get_f(10)(); //gets correct f and calls it
}

первая версия генерирует следующую ошибку:

error: use of parameter 't' outside function body

что действительно сбивает с толку, поскольку использование параметров в операторе decltype конечного возвращаемого типа должно быть нормальным?

вторая версия генерирует следующую ошибку :

error: invalid initialization of non-const reference of type 'void (&)()' 
       from an rvalue of type ''

что сбивает с толку, поскольку я полностью квалифицировал f в get_f . Я бы ожидал такого рода сообщений об ошибках, если бы у меня не было constexpr . Так что, у меня есть ложное представление о том, что делает constexpr , или является ли реализация GCC на C ++ 0x ошибочной для этого случая?

Я использую GCC 4.6.2

10
задан Community 23 May 2017 в 12:06
поделиться