You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C++类成员多维数组初始化报错:表达式需为可修改左值

为什么this->Children = {}会触发“Expression must have a modifiable lvalue”错误?

这个问题的核心原因很直白:在C++中,数组属于不可修改的左值(non-modifiable lvalue),你不能直接用赋值运算符=给整个数组赋值

你的Childrenint[2][2]类型的二维数组,数组名本质上是指向首元素的常量指针——你没法改变它指向的内存位置,也不能通过赋值操作直接替换整个数组的内容。所以this->Children = {}这种试图直接给整个数组赋值的写法,编译器必然会报错。

你可以用这些正确的方式初始化Children

1. 构造函数初始化列表(C++11及以上推荐)

直接在构造函数的成员初始化列表里用列表初始化数组,这是最符合C++规范且高效的方式,能一次性把数组所有元素初始化为0:

Foo::Foo(const unsigned int index) : Index(index), Children{} {
    this->Size = 0.5 / index;
    // 这里不需要再写循环初始化了,Children已经被值初始化全为0
    if (index < MAX_DIVS) {
        // 这里可以写index小于MAX_DIVS时的其他逻辑
    }
}

注意:这种写法需要编译器支持C++11或更高版本。

2. 保留循环逐个赋值(兼容旧C++版本)

如果你需要兼容C++11之前的版本,或者有自定义的初始化逻辑,删掉错误的this->Children = {}行,保留你的循环即可:

Foo::Foo(const unsigned int index) : Index(index) {
    this->Size = 0.5 / index;
    // 不管index是否小于MAX_DIVS,都初始化数组(可根据你的需求调整范围)
    for (int _x = 0; _x < 2; _x++) {
        for (int _y = 0; _y < 2; _y++) {
            this->Children[_x][_y] = 0;
        }
    }
    if (index < MAX_DIVS) {
        // 这里写index小于MAX_DIVS时的额外操作
    }
}

另外提个小建议:如果index可能为0,0.5 / index会触发除零错误,最好加个判断避免这种情况。

内容的提问来源于stack exchange,提问作者Fabrizio

火山引擎 最新活动