decltype (* & fun) странный? - PullRequest
       10

decltype (* & fun) странный?

4 голосов
/ 27 февраля 2012

у меня есть:

#include <type_traits>
#include <stdio.h>

void f() { printf("foo\n"); }

int main()
{
  printf("%d %d %d\n",
    std::is_same<decltype(*&f),decltype(f)>::value,
    std::is_function<decltype(*&f)>::value,
    std::is_function<decltype(f)>::value);
  (*&f)();
  return 0;
}

, что дает

0 0 1
foo

на g ++ 4.6.1 и 4.7.0.

Кто-нибудь может мне это объяснить?

1 Ответ

13 голосов
/ 27 февраля 2012

Важно отметить, что 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).

...