结构体const引用的内部元素能否修改?代码现象存疑求解
问题:const结构体引用为何能修改其引用成员?
在void DoWork(const int &n)中,n作为实参的const引用,无法被修改值。但如下代码中,包含int&成员的Test结构体,在接收const Test& test参数的doSth函数里,却能修改test.index的值,运行后输出100。为何test是const引用,其成员index却能被修改?
struct Test { int& index ; }; void doSth(const Test& test) { test.index = 100; }; int main() { int a = 3; Test test = { .index = a, }; doSth(test); std::cout << test.index; }
原理性解释
- const的作用范围是结构体对象本身,而非引用成员指向的目标:当你使用
const Test& test时,const仅限制test这个结构体实例的自身状态——你不能修改结构体成员的绑定关系(比如不能把test.index重新绑定到另一个int变量),但完全允许通过这个引用成员去修改它所指向的对象的值。 - 引用成员的const特性规则:在const限定的结构体中,引用成员的类型不会自动变为
const int&。引用本身的绑定关系是不可变的,const对结构体的限定只是禁止修改成员的绑定,而非禁止通过引用修改目标对象。也就是说,const Test里的index依然是int&类型,而非const int&,所以可以通过它修改指向的int变量。 - 对比普通成员的差异:如果结构体成员是普通
int而非int&,那么const Test&中的该成员会被视为const int,无法直接修改。但引用成员的特性决定了,const限定不会传递到它指向的对象上。
内容的提问来源于stack exchange,提问作者Bobby
相关产品推荐
相关产品推荐

