代码之家  ›  专栏  ›  技术社区  ›  James McNellis

显式类型转换和多个简单类型说明符

  •  8
  • James McNellis  · 技术社区  · 16 年前

    值初始化类型的对象 T ,人们会按照以下方式之一执行操作:

    T x = T();
    T x((T()));
    

    我的问题涉及由简单类型说明符组合指定的类型,例如, unsigned int :

    unsigned int x = unsigned int();
    unsigned int x((unsigned int()));
    

    Visual C++ 2008和英特尔C++编译器11.1在没有警告的情况下接受这两种方法;COMU4.4.3.1B2和G+3.4.5(这是公认的,但不是最近的)。

    根据C++标准(C++ 03 5.2.3/2,ExpR.Type CONV):

    表达 T() 在哪里 T 是非数组完整对象类型的简单类型说明符(7.1.5.2)或(可能是cv限定的) void 类型,创建指定类型的值,该值已初始化

    7.1.5.2说,“简单类型说明符是”,然后是一个列表,其中包括 unsigned int .

    因此,在5.2.3/2中,“简单类型说明符”是单数的,并且 未签名的 int 是两个类型说明符,上面的示例使用 无符号整型 无效?(如果是的话,接下来的问题是,微软和英特尔支持上述表达式是否不正确?)

    这个问题比任何其他问题都更令人好奇;对于由多个简单类型说明符组合指定的所有类型,值初始化相当于零初始化。(这个问题是由 comments in response to this answer to a question about initialization )

    4 回复  |  直到 16 年前
        1
  •  8
  •   Community Mohan Dere    9 年前

    posted this question to comp.lang.c++.moderated .

    C++标准委员会的丹尼尔Kr.G.GLER同意解释 unsigned int 是一个 组合 简单类型说明符,并且本身不是简单类型说明符。

    关于表7的标题 referenced by Jerry Coffin ,krgler说:

    我同意表7的标题(在大多数情况下是表9 最近的草案n3000)有些误导,但是 [dcl.type.simple]/2中的文本在我看来非常清晰,它显示:

    表7总结了简单类型说明符的有效组合 以及它们指定的类型。”

    (很抱歉,我花了很长时间才从新闻组发回这里;我完全忘记了)

        2
  •  1
  •   Jerry Coffin    16 年前

    在第7.1.5.2节中,继续往下读到表7,其中包含了允许作为简单说明符的完整列表(包括“unsigned int”)。

        3
  •  1
  •   Potatoswatter    16 年前

    嗯,有时候你需要一个typedef。如果它没有说需要诊断,那么他们支持这一点是不正确的。不过,为了便于移植,可以使用typedef( uint16_t uint64_t ,尽管这些可能不正确),或者用模板引用类型名:

    iterator<void, unsigned long>::value_type( 5 )
    

    这是怎么回事?

    编辑:嗯,或者只是 5ul . 那叶子 unsigned short , unsigned char signed char 作为唯一不容易显式构造的类型。

        4
  •  -2
  •   smerlin    16 年前

    7.1.5.2

    简单类型说明符指定先前声明的用户定义类型或基本类型之一`

    这意味着 unsigned int i = unsigned int() 是合法的,因为 unsigned int 是一种基本类型(因此 简单类型说明符 ,见3.9.1)。

    这同样适用于以下类型:

    long double
    long long
    long long int
    unsigned long
    unsigned long long int
    short int
    ...