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++标准的有效代码.
标准的报价将受到高度赞赏.
C++03/C++11 答案
\n\n不,这不对。
\n\n在 的右侧=,points确实存在1,但初始化程序仅在其所有操作数都被求值后才应用。
如果points在命名空间范围内(因此具有静态存储持续时间并且已被零初始化2),那么这是“安全的”,但您对points[0]那里的使用将为您提供0,而不是QPointF(r.left() - i, r.top() - i)再次。
如果points具有自动存储持续时间 - 它尚未初始化,因此您的使用points[0]正在尝试使用未初始化的变量,其中points[0]具有不确定的值......这是不好的3。
很难为此提供标准参考,只能说没有任何内容8.5 "Initializers"明确地使这成为可能,并且其他地方的规则填补了其余部分。
\n\n1
\n\n[n3290: 3.3.2/1]:名称的声明点紧接在其完整声明符(第 8 条)之后和其初始值设定项(如果有)之前,除非下面另有说明。[例子:Run Code Online (Sandbox Code Playgroud)\n\nint x = 12;\n{ int x = x; }\n这里第二个
\n\nx是用它自己的(不确定的)值初始化的。\xe2\x80\x94结束示例]2
\n\n[n3290: 3.6.2/2]:具有静态存储持续时间 (3.7.1) 或线程存储持续时间 (3.7.2) 的变量应在任何其他初始化发生之前进行零初始化 (8.5)\n。[..]3
\n[n3290: 17.6.3.3/2]:[..] [注意:涉及不确定值的操作可能会导致未定义的行为。\xe2\x80\x94结束注]
| 归档时间: |
|
| 查看次数: |
430 次 |
| 最近记录: |