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)?
};
While this compiles with the MS Visual Studio Compiler, i am not sure if this is valid code according to the C++ Standard.
Quotes from the Standard would be highly appreciated.
C++03/C++11 answer
No, it’s not.
On the right-hand side of the
=,pointsdoes exist1 but the initialiser is only applied after all its operands have been evaluated.If
pointsis at namespace scope (and thus has static storage duration and has been zero-initialized2), then this is “safe” but your use ofpoints[0]there is going to give you0, rather thanQPointF(r.left() - i, r.top() - i)again.If
pointshas automatic storage duration — it has not yet been initialised so your use ofpoints[0]is attempting to use an uninitialised variable, wherepoints[0]has an indeterminate value… which is bad3.It’s difficult to provide standard references for this, other than to say that there is nothing in
8.5 "Initializers"that explicitly makes this possible, and rules elsewhere fill in the rest.