Что такое неназванный тип в С++?

Как часть моего туалетного чтения на стандарте С++ стандарта ANSI ISO IEC 14882 2003, я натолкнулся на следующее:

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

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

Ответы

Ответ 1

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

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

Обратите внимание, что это ограничение было снято в С++ 0x, поэтому оно будет действительным (вы также сможете использовать локальные типы в качестве параметров шаблона типа). В С++ 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)

Ответ 2

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

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

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

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