Explicit Type Conversion and Multiple Simple Type Specifiers

后端 未结 4 1376
执笔经年
执笔经年 2020-12-03 12:38

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()));
<
相关标签:
4条回答
  • 2020-12-03 12:58

    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.

    0 讨论(0)
  • 2020-12-03 12:59

    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").

    0 讨论(0)
  • 2020-12-03 13:04

    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)

    0 讨论(0)
  • 2020-12-03 13:13

    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
    ...
    
    0 讨论(0)
提交回复
热议问题