Я пытался найти решение проблемы вопроса Шаблон 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