C++自引用数组?

aar*_*rkk 19 c++

我不小心通过数组中的自引用在程序中创建了一个错误.这是一个非常简化的演示程序,在概念上类似:

#include <iostream>
using namespace std;

int kTest[] = {
    kTest[0]
};

int main() {
    cout << kTest[0] << endl;
}
Run Code Online (Sandbox Code Playgroud)

我很惊讶我既没有收到编译错误,也没有收到关于此代码的警告!在我的情况下,它最终产生不可预测的输出.它是否访问垃圾内存?

我很好奇在什么情况下这将有明确定义的输出(如果有的话!).

编辑:是否有所作为,如果kTeststatic?怎么样const?都?

R S*_*ahu 15

int kTest[] = {
    kTest[0]
};
Run Code Online (Sandbox Code Playgroud)

类似于,如果不完全相同

int x = x;
Run Code Online (Sandbox Code Playgroud)

如果在函数中本地声明,它将是未定义的行为.

kTest一个全局变量时,它似乎很明确.有关其他详细信息,请参阅其他答案


krz*_*zaq 8

我不太确定这是不确定的.从当前草案中引用:

[basic.start.static]/3

如果未执行常量初始化,则具有静态存储持续时间([basic.stc.static])或线程存储持续时间([basic.stc.thread])的变量将进行零初始化([dcl.init]).零初始化和常量初始化一起称为静态初始化; 所有其他初始化是动态初始化. 在进行任何动态初始化之前,应执行静态初始化.

对我来说,kTest当动态初始化开始时它看起来已经零初始化,因此可以定义为初始化为0.