C++类成员多维数组初始化报错:表达式需为可修改左值
为什么
this->Children = {}会触发“Expression must have a modifiable lvalue”错误? 这个问题的核心原因很直白:在C++中,数组属于不可修改的左值(non-modifiable lvalue),你不能直接用赋值运算符=给整个数组赋值。
你的Children是int[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




