[dcl.type.simple]

# 9 Declarations [[dcl]](./#dcl)

## 9.2 Specifiers [[dcl.spec]](dcl.spec#dcl.type.simple)

### 9.2.9 Type specifiers [[dcl.type]](dcl.type#simple)

#### 9.2.9.3 Simple type specifiers [dcl.type.simple]

[1](#1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L1370)

The simple type specifiers are

[simple-type-specifier:](#nt:simple-type-specifier "9.2.9.3 Simple type specifiers [dcl.type.simple]")  
[*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3 Qualified names [expr.prim.id.qual]")opt [*type-name*](#nt:type-name "9.2.9.3 Simple type specifiers [dcl.type.simple]")  
[*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3 Qualified names [expr.prim.id.qual]") template [*simple-template-id*](temp.names#nt:simple-template-id "13.3 Names of template specializations [temp.names]")  
[*computed-type-specifier*](#nt:computed-type-specifier "9.2.9.3 Simple type specifiers [dcl.type.simple]")  
[*placeholder-type-specifier*](dcl.spec.auto.general#nt:placeholder-type-specifier "9.2.9.7.1 General [dcl.spec.auto.general]")  
[*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3 Qualified names [expr.prim.id.qual]")opt [*template-name*](temp.names#nt:template-name "13.3 Names of template specializations [temp.names]")  
char  
char8_t  
char16_t  
char32_t  
wchar_t  
bool  
short  
int  
long  
signed  
unsigned  
float  
double  
void

[type-name:](#nt:type-name "9.2.9.3 Simple type specifiers [dcl.type.simple]")  
[*class-name*](class.pre#nt:class-name "11.1 Preamble [class.pre]")  
[*enum-name*](dcl.enum#nt:enum-name "9.8.1 Enumeration declarations [dcl.enum]")  
[*typedef-name*](dcl.typedef#nt:typedef-name "9.2.4 The typedef specifier [dcl.typedef]")

[computed-type-specifier:](#nt:computed-type-specifier "9.2.9.3 Simple type specifiers [dcl.type.simple]")  
[*decltype-specifier*](dcl.type.decltype#nt:decltype-specifier "9.2.9.6 Decltype specifiers [dcl.type.decltype]")  
[*pack-index-specifier*](dcl.type.pack.index#nt:pack-index-specifier "9.2.9.4 Pack indexing specifier [dcl.type.pack.index]")  
[*splice-type-specifier*](dcl.type.splice#nt:splice-type-specifier "9.2.9.9 Type splicing [dcl.type.splice]")

[2](#2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L1409)

The component names of a [*simple-type-specifier*](#nt:simple-type-specifier "9.2.9.3 Simple type specifiers [dcl.type.simple]") are those of its[*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3 Qualified names [expr.prim.id.qual]"),[*type-name*](#nt:type-name "9.2.9.3 Simple type specifiers [dcl.type.simple]"),[*simple-template-id*](temp.names#nt:simple-template-id "13.3 Names of template specializations [temp.names]"),[*template-name*](temp.names#nt:template-name "13.3 Names of template specializations [temp.names]"), and/or[*type-constraint*](temp.param#nt:type-constraint "13.2 Template parameters [temp.param]") (if it is a [*placeholder-type-specifier*](dcl.spec.auto.general#nt:placeholder-type-specifier "9.2.9.7.1 General [dcl.spec.auto.general]"))[.](#2.sentence-1)

The component name of a [*type-name*](#nt:type-name "9.2.9.3 Simple type specifiers [dcl.type.simple]") is the first name in it[.](#2.sentence-2)

[3](#3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L1420)

A [*placeholder-type-specifier*](dcl.spec.auto.general#nt:placeholder-type-specifier "9.2.9.7.1 General [dcl.spec.auto.general]") is a placeholder for
a type to be deduced ([[dcl.spec.auto]](dcl.spec.auto "9.2.9.7 Placeholder type specifiers"))[.](#3.sentence-1)

A [*type-specifier*](dcl.type.general#nt:type-specifier "9.2.9.1 General [dcl.type.general]") is a placeholder for
a deduced class type ([[dcl.type.class.deduct]](dcl.type.class.deduct "9.2.9.8 Deduced class template specialization types")) if either

- [(3.1)](#3.1)

it is of the formtypenameopt [*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3 Qualified names [expr.prim.id.qual]")opt [*template-name*](temp.names#nt:template-name "13.3 Names of template specializations [temp.names]") or

- [(3.2)](#3.2)

it is of the form typenameopt [*splice-specifier*](basic.splice#nt:splice-specifier "6.6 Splice specifiers [basic.splice]") and
the [*splice-specifier*](basic.splice#nt:splice-specifier "6.6 Splice specifiers [basic.splice]") designates
a class template or alias template[.](#3.sentence-2)

The [*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3 Qualified names [expr.prim.id.qual]") or [*splice-specifier*](basic.splice#nt:splice-specifier "6.6 Splice specifiers [basic.splice]"),
if any, shall be non-dependent and
the [*template-name*](temp.names#nt:template-name "13.3 Names of template specializations [temp.names]") or [*splice-specifier*](basic.splice#nt:splice-specifier "6.6 Splice specifiers [basic.splice]") shall designate a deducible template[.](#3.sentence-3)

A [*deducible template*](#def:template,deducible "9.2.9.3 Simple type specifiers [dcl.type.simple]") is either a class template or
is an alias template whose [*defining-type-id*](dcl.name#nt:defining-type-id "9.3.2 Type names [dcl.name]") is of the form

typenameopt [*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3 Qualified names [expr.prim.id.qual]")opt templateopt [*simple-template-id*](temp.names#nt:simple-template-id "13.3 Names of template specializations [temp.names]")

where the [*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3 Qualified names [expr.prim.id.qual]") (if any) is non-dependent and
the [*template-name*](temp.names#nt:template-name "13.3 Names of template specializations [temp.names]") of the [*simple-template-id*](temp.names#nt:simple-template-id "13.3 Names of template specializations [temp.names]") names a deducible template[.](#3.sentence-5)

[*Note [1](#note-1)*:

An injected-class-name is never interpreted as a [*template-name*](temp.names#nt:template-name "13.3 Names of template specializations [temp.names]") in contexts where class template argument deduction would be performed ([[temp.local]](temp.local "13.8.2 Locally declared names"))[.](#3.sentence-6)

â *end note*]

The other[*simple-type-specifier*](#nt:simple-type-specifier "9.2.9.3 Simple type specifiers [dcl.type.simple]")*s* specify either a previously-declared type, a type determined from an
expression, or one of the
fundamental types ([[basic.fundamental]](basic.fundamental "6.9.2 Fundamental types"))[.](#3.sentence-7)

Table [17](#tab:dcl.type.simple "Table 17: simple-type-specifiers and the types they specify") summarizes the valid combinations of[*simple-type-specifier*](#nt:simple-type-specifier "9.2.9.3 Simple type specifiers [dcl.type.simple]")*s* and the types they specify[.](#3.sentence-8)

Table [17](#tab:dcl.type.simple) — [*simple-type-specifier*](#nt:simple-type-specifier "9.2.9.3 Simple type specifiers [dcl.type.simple]")*s* and the types they specify [[tab:dcl.type.simple]](./tab:dcl.type.simple)  

| [ð](#tab:dcl.type.simple-row-1)<br>**Specifier(s)** | **Type** |
| --- | --- |
| [ð](#tab:dcl.type.simple-row-2)<br>[*type-name*](#nt:type-name "9.2.9.3 Simple type specifiers [dcl.type.simple]") | the type named |
| [ð](#tab:dcl.type.simple-row-3)<br>[*simple-template-id*](temp.names#nt:simple-template-id "13.3 Names of template specializations [temp.names]") | the type as defined in [[temp.names]](temp.names "13.3 Names of template specializations") |
| [ð](#tab:dcl.type.simple-row-4)<br>[*decltype-specifier*](dcl.type.decltype#nt:decltype-specifier "9.2.9.6 Decltype specifiers [dcl.type.decltype]") | the type as defined in [[dcl.type.decltype]](dcl.type.decltype "9.2.9.6 Decltype specifiers") |
| [ð](#tab:dcl.type.simple-row-5)<br>[*pack-index-specifier*](dcl.type.pack.index#nt:pack-index-specifier "9.2.9.4 Pack indexing specifier [dcl.type.pack.index]") | the type as defined in [[dcl.type.pack.index]](dcl.type.pack.index "9.2.9.4 Pack indexing specifier") |
| [ð](#tab:dcl.type.simple-row-6)<br>[*placeholder-type-specifier*](dcl.spec.auto.general#nt:placeholder-type-specifier "9.2.9.7.1 General [dcl.spec.auto.general]") | the type as defined in [[dcl.spec.auto]](dcl.spec.auto "9.2.9.7 Placeholder type specifiers") |
| [ð](#tab:dcl.type.simple-row-7)<br>[*template-name*](temp.names#nt:template-name "13.3 Names of template specializations [temp.names]") | the type as defined in [[dcl.type.class.deduct]](dcl.type.class.deduct "9.2.9.8 Deduced class template specialization types") |
| [ð](#tab:dcl.type.simple-row-8)<br>[*splice-type-specifier*](dcl.type.splice#nt:splice-type-specifier "9.2.9.9 Type splicing [dcl.type.splice]") | the type as defined in [[dcl.type.splice]](dcl.type.splice "9.2.9.9 Type splicing") |
| [ð](#tab:dcl.type.simple-row-9)<br>char | âcharâ |
| [ð](#tab:dcl.type.simple-row-10)<br>unsigned char | âunsigned charâ |
| [ð](#tab:dcl.type.simple-row-11)<br>signed char | âsigned charâ |
| [ð](#tab:dcl.type.simple-row-12)<br>char8_t | âchar8_tâ |
| [ð](#tab:dcl.type.simple-row-13)<br>char16_t | âchar16_tâ |
| [ð](#tab:dcl.type.simple-row-14)<br>char32_t | âchar32_tâ |
| [ð](#tab:dcl.type.simple-row-15)<br>bool | âboolâ |
| [ð](#tab:dcl.type.simple-row-16)<br>unsigned | âunsigned intâ |
| [ð](#tab:dcl.type.simple-row-17)<br>unsigned int | âunsigned intâ |
| [ð](#tab:dcl.type.simple-row-18)<br>signed | âintâ |
| [ð](#tab:dcl.type.simple-row-19)<br>signed int | âintâ |
| [ð](#tab:dcl.type.simple-row-20)<br>int | âintâ |
| [ð](#tab:dcl.type.simple-row-21)<br>unsigned short int | âunsigned short intâ |
| [ð](#tab:dcl.type.simple-row-22)<br>unsigned short | âunsigned short intâ |
| [ð](#tab:dcl.type.simple-row-23)<br>unsigned long int | âunsigned long intâ |
| [ð](#tab:dcl.type.simple-row-24)<br>unsigned long | âunsigned long intâ |
| [ð](#tab:dcl.type.simple-row-25)<br>unsigned long long int | âunsigned long long intâ |
| [ð](#tab:dcl.type.simple-row-26)<br>unsigned long long | âunsigned long long intâ |
| [ð](#tab:dcl.type.simple-row-27)<br>signed long int | âlong intâ |
| [ð](#tab:dcl.type.simple-row-28)<br>signed long | âlong intâ |
| [ð](#tab:dcl.type.simple-row-29)<br>signed long long int | âlong long intâ |
| [ð](#tab:dcl.type.simple-row-30)<br>signed long long | âlong long intâ |
| [ð](#tab:dcl.type.simple-row-31)<br>long long int | âlong long intâ |
| [ð](#tab:dcl.type.simple-row-32)<br>long long | âlong long intâ |
| [ð](#tab:dcl.type.simple-row-33)<br>long int | âlong intâ |
| [ð](#tab:dcl.type.simple-row-34)<br>long | âlong intâ |
| [ð](#tab:dcl.type.simple-row-35)<br>signed short int | âshort intâ |
| [ð](#tab:dcl.type.simple-row-36)<br>signed short | âshort intâ |
| [ð](#tab:dcl.type.simple-row-37)<br>short int | âshort intâ |
| [ð](#tab:dcl.type.simple-row-38)<br>short | âshort intâ |
| [ð](#tab:dcl.type.simple-row-39)<br>wchar_t | âwchar_tâ |
| [ð](#tab:dcl.type.simple-row-40)<br>float | âfloatâ |
| [ð](#tab:dcl.type.simple-row-41)<br>double | âdoubleâ |
| [ð](#tab:dcl.type.simple-row-42)<br>long double | âlong doubleâ |
| [ð](#tab:dcl.type.simple-row-43)<br>void | âvoidâ |

[4](#4)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/declarations.tex#L1531)

When multiple [*simple-type-specifier*](#nt:simple-type-specifier "9.2.9.3 Simple type specifiers [dcl.type.simple]")*s* are allowed, they can be
freely intermixed with other [*decl-specifier*](dcl.spec.general#nt:decl-specifier "9.2.1 General [dcl.spec.general]")*s* in any order[.](#4.sentence-1)

[*Note [2](#note-2)*:

It is implementation-defined whether objects of char type are
represented as signed or unsigned quantities[.](#4.sentence-2)

The signed specifier
forces char objects to be signed; it is redundant in other contexts[.](#4.sentence-3)

â *end note*]
