To value initialize an object of type T
, one would do something along the lines of one of the following:
T x = T();
T x((T()));
<
Hmm, sometimes you need a typedef. If it doesn't say a diagnostic is required, then it's not incorrect for them to support this. Nevertheless, for portability, you can use a typedef (uint16_t
or uint64_t
, although those might not be right), or quote the typename with a template:
iterator<void, unsigned long>::value_type( 5 )
How's that for unreasonably verbose?
Edit: Duh, or simply 5ul
. That leaves unsigned short
, unsigned char
, and signed char
as the only types you can't easily explicitly construct.
In §7.1.5.2, keep reading down to table 7, which has the full list of what's allowed as a simple specifier (which does include "unsigned int").
I posted this question to comp.lang.c++.moderated.
Daniel Krügler of the C++ standards committee agreed with the interpretation that unsigned int
is a combination of simple type specifiers, and is not itself a simple type specifier.
Concerning the caption of table 7 referenced by Jerry Coffin, Krügler says:
I agree that the header of Table 7 (which is Table 9 in the most recent draft N3000) is somewhat misleading, but the preceeding text in [dcl.type.simple]/2 looks very clear to me, when it says:
Table 7 summarizes the valid combinations of simple-type-specifiers and the types they specify."
(I apologize it took me so long to post this back here from the newsgroup; it completely slipped my mind)
7.1.5.2:
The simple-type-specifiers specify either a previously-declared user-defined type or one of the fundamental types`
This implies that unsigned int i = unsigned int()
is legal, since unsigned int
is a fundamental type (and thus a simple-type-specifier, see 3.9.1).
same applies for types like:
long double
long long
long long int
unsigned long
unsigned long long int
short int
...