数组初始化,引用前一个元素好吗?

sme*_*lin 9 c++ arrays standards initialization

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)?
};
Run Code Online (Sandbox Code Playgroud)

虽然这与MS Visual Studio编译器编译,但我不确定这是否是根据C++标准的有效代码.

标准的报价将受到高度赞赏.

Lig*_*ica 4

C++03/C++11 答案

\n\n
\n\n

不,这不对。

\n\n

在 的右侧=points确实存在1,但初始化程序仅在其所有操作数都被求值后才应用。

\n\n
    \n
  • 如果points在命名空间范围内(因此具有静态存储持续时间并且已被零初始化2),那么这是“安全的”,但您对points[0]那里的使用将为您提供0,而不是QPointF(r.left() - i, r.top() - i)再次。

  • \n
  • 如果points具有自动存储持续时间 - 它尚未初始化,因此您的使用points[0]正在尝试使用未初始化的变量,其中points[0]具有不确定的值......这是不好的3

  • \n
\n\n

很难为此提供标准参考,只能说没有任何内容8.5 "Initializers"明确地使这成为可能,并且其他地方的规则填补了其余部分。

\n\n
\n\n
\n

1 [n3290: 3.3.2/1]: 名称的声明点紧接在其完整声明符(第 8 条)之后和其初始值设定项(如果有)之前,除非下面另有说明。[例子:

\n\n
int x = 12;\n{ int x = x; }\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里第二个x是用它自己的(不确定的)值初始化的。\xe2\x80\x94结束示例]

\n\n

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

\n\n

3 [n3290: 17.6.3.3/2]: [..] [注意:涉及不确定值的操作可能会导致未定义的行为。\xe2\x80\x94结束注]

\n
\n