代码之家  ›  专栏  ›  技术社区  ›  smerlin

数组初始化,是否引用上一个元素?

  •  9
  • smerlin  · 技术社区  · 14 年前
    const QPointF points[] =
    {
        QPointF(r.left() - i, r.top() - i),
        QPointF(r.right() + i, r.top() - i),
        QPointF(r.right() + i, r.bottom() + i),
        QPointF(r.left() - i, r.bottom() + i),
        points[0] // is this line valid (according to the C++ standard)?
    };
    

    引用标准 非常感谢。

    4 回复  |  直到 14 年前
        1
  •  3
  •   Lightness Races in Orbit    13 年前

    C++ 03/C++ 11答案


    不,不是。

    在…的右边 = , points 1个 但是,初始化器只有在其所有操作数都被求值之后才被应用。

    • 如果 点数 在命名空间范围内(因此具有静态存储持续时间并且已初始化为零 2个 points[0] 会给你的 0 ,而不是 QPointF(r.left() - i, r.top() - i) 再一次。

    • 如果 具有自动存储持续时间-尚未初始化,因此您可以使用 点数[0] 正在尝试使用未初始化的变量,其中 点数[0] .

    8.5 "Initializers" 这明确地使这成为可能,其他地方的规则填补了其余部分。


    [n3290: 3.3.2/1]: 名称的声明点紧跟在其完整的声明符之后 (第8条)以及在其初始值设定项(如有)之前,除非如下所述。[ 例子:

    int x = 12;
    { int x = x; }
    

    这里是第二个 x (不确定) 价值。 ]

    2个 [n3290: 3.6.2/2]: 具有静态存储持续时间(3.7.1)或线程存储持续时间(3.7.2)的变量应初始化为零(8.5) 在进行任何其他初始化之前。[..]

    [n3290: 17.6.3.3/2]: 注: 涉及不确定的值可能会导致未定义的行为。 尾注 ]

        2
  •  2
  •   Anycorn    14 年前

    http://www.comeaucomputing.com/pcgi-bin/compiler.cgi :

    Copyright 1988-2008 Comeau Computing.  All rights reserved.
    MODE:strict errors C++ C++0x_extensions
    
    "ComeauTest.c", line 8: warning: variable "points" is used before its value is set
          points[0] // is this line valid (according to the C++ standard)?
    
        3
  •  0
  •   eudoxos    13 年前

    既然没有 sequence point i=i++ 维基百科上引用的例子。

        4
  •  -2
  •   smerlin    13 年前

    旧答案(漏掉了重点):

    我检查了当前的C++ 0x草稿,在那里我发现了一个句子:

    初始值设定项子句 在中评估

    因此,虽然这个句子不是C++标准的一部分,从2003开始,我很确定,这应该在任何最新的编译器中工作,如果这是C++ 0x的一部分。

    编辑:
    这些评论使我重新考虑了这件事。这条线只确保 QPointF points 在其数组初始化期间不确定。所以不能保证 points[0] 或者,如果你依靠标准,至少不会。