Важно отметить, что decltype
имеет два значения: он может быть использован, чтобы найти объявленный тип (отсюда его название) в сущности, или он может быть использован для проверки в выражения. Я использую сущность здесь свободно и не имею в виду ни один термин Стандарта, но, просто говоря, это может быть переменная, функция или (как ни странно, на мой взгляд) членский доступ. Тип, который возвращается, когда рассматривается выражение чаще, чем не отличается от типа самого выражения, таким образом:
int i;
void foo();
struct { int i; } t;
static_assert(std::is_same<decltype(i), int>::value, "");
static_assert(std::is_same<decltype(foo), void()>::value, "");
static_assert(std::is_same<decltype(t.i), int>::value, "");
static_assert(std::is_same<decltype((i)), int&>::value, "");
static_assert(std::is_same<decltype((foo)), void(&)()>::value, "");
static_assert(std::is_same<decltype((t.i)), int&>::value, "");
Обратите внимание, как это работает для функций, и, следовательно, в вашем случае decltype(*&f)
одно и то же как decltype((f))
, а не decltype(f)
.
Я уверен, что '* & f' является ссылочным типом. –
Бинго! std :: remove_reference <...> делает трюк! – smilingthax