Ответ 1
Это жестко закодировано в определении static_cast
:
[expr.static.cast] (emphasis mine)
1 Результатом выражения
static_cast<T>(v)
является результат преобразования выраженияv
в типT
. ЕслиT
является lvalue ссылочный тип или rvalue ссылка на тип функции, результат lvalue; еслиT
является rvalue ссылкой на тип объекта, результат значение x; в противном случае результат является prvalue.static_cast
оператор не должен выбрасывать постоянство.
decltype
уважает категорию значений своего операнда и создает ссылку lvalue для выражений lvalue.
Причина может быть в том, что сами имена функций всегда являются lvalues, и поэтому rvalue типа функции не может появляться "в дикой природе". Таким образом, приведение к этому типу, вероятно, не имеет большого смысла.