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

13

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

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

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

"чтение туалета на C ++ Standard" o_O James McNellis

Ваш Ответ

1   ответ
22

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

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)
@Kirakun: Да - структуры и классы в основном одинаковы. Вы можете иметь то же самое с союзом. Jeremiah Willcock
@Gman: это не верный ответ. Ответ говорит, что вы не можете использоватьint* в качестве аргумента шаблона. Ты можешь. Cheers and hth. - Alf
Еслиclass безымянный, как вы могли бы определить его конструктор? kirakun
-1 За не ставить под сомнение авторитет. ;-) Например,int* это безымянный тип в соответствии с вашим определением, когда я пишу это, но может быть использован аргумент шаблона. Если доверять авторитету (стандарту), существует также более тонкая проблема с именованными типами классов с именованными членами типов. Эта более тонкая проблема решаетсяDR № 62, который (политический?) не упоминает более очевидную терминологическую проблему, но чье предлагаемое решение затрагивает обе проблемы. Так или иначе, в N3126 текст был удален, заменен ненормативным примером. Cheers and hth. - Alf
@ Киракун: Да,struct а такжеclass по сути одинаковы, Также:enum { unnamed = 0 };. GManNickG

Похожие вопросы