Что такое безымянный тип в C ++? - PullRequest
13 голосов
/ 27 февраля 2011

При чтении туалета по стандарту C ++ ANSI ISO IEC 14882 2003 я обнаружил следующее:

14.3.1.2: локальный тип, тип без связи, безымянныйТип или тип, составленный из любого из этих типов, не должен использоваться в качестве аргумента шаблона для параметра типа шаблона.

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

Ответы [ 2 ]

22 голосов
/ 27 февраля 2011

«Безымянный тип» действительно означает «безымянное перечисление или тип класса» [для получения дополнительной информации см. Комментарии к этому ответу].Перечисление или тип класса не обязательно должны иметь имя.Например:

struct { int i; } x; // x is of a type with no name

Вы можете попытаться использовать неназванный тип в качестве аргумента шаблона путем выведения аргумента:

template <typename T> void f(T) { }

struct { int i; } x;
f(x); // would call f<[unnamed-type]>() and is invalid in C++03

Обратите внимание, что это ограничение было снято в C ++ 0x,так что будет действительным (вы также сможете использовать локальные типы в качестве параметров шаблона типа).В C ++ 0x вы также можете использовать decltype для «именования» безымянного типа:

template <typename T> void g() { }

struct { int i; } x;
f<decltype(x)>(); // valid in C++0x (decltype doesn't exist in C++03)
1 голос
/ 27 февраля 2011

Подумайте о следующем коде:

template <typename T>
void foo(const T&) {}

struct {
  int x;
} y;
foo(y);

Это включает в себя безымянный тип. Обратите внимание, что в C ++ правило отличается от 0x.

...