该错误本质是编译期拦截对只读内存位置的赋值,常见于const变量直接赋值、const引用/指针间接修改、const成员函数中修改非mutable成员;需根据语义选择移除const、使用mutable或复制对象。

为什么 const 对象或引用被赋值会触发这个错误
编译器报 assignment of read-only location,本质是试图修改一个被标记为只读的内存位置。常见于:对 const 变量直接赋值、通过 const 引用或指针间接赋值、在 const 成员函数里修改非 mutable 成员变量。
这不是运行时错误,而是编译期拦截——C++ 用类型系统强制保护只读语义,一旦违反就拒绝生成代码。
const 变量初始化后不能重新赋值
最直白的误用:const int x = 5; x = 10;。这里 x 是顶层 const,地址绑定后不可更改。
- ✅ 正确做法:把需要修改的变量声明为非常量,如
int x = 5; - ✅ 若需“逻辑只读但物理可变”,用
mutable(仅限类成员) - ❌ 不要试图用
const_cast强转绕过——除非你 100% 确定原始对象本身非 const,否则行为未定义
函数参数或返回值带 const 时的典型陷阱
比如函数声明为 void foo(const std::vector,你在函数体内写 v.push_back(42) 就会触发该错误,因为 v 是 const 引用,禁止调用非常量成员函数。
- 检查函数签名:若参数是
const T&或const T*,就不能调用T的非常量成员函数(如push_back、clear、operator[]非 const 版本) - 若确实需要修改,要么去掉参数的
const(注意是否破坏接口契约),要么在调用前复制一份:std::vectorv_copy = v; - 注意
std::string_view、std::span等轻量视图类型默认也是 const-friendly,别指望能通过它们修改底层数据
类成员函数标 const 后误改成员变量
在 void MyClass::bar() const 函数里写 count++;,而 count 不是 mutable,就会触发该错误。
-
const成员函数隐含 this 指针类型为const MyClass*,所有成员访问都按 const 限定处理 - 只有明确标记为
mutable的成员(如缓存、计数器、互斥锁)才允许在 const 函数中修改 - 如果修改的是某个成员的内部状态(比如
std::unique_ptr指向的对象),那不违反 const——因为 const 限定的是指针本身,不是它指向的内容
这个错误其实挺“诚实”的:它不让你绕过 const 正确性。真正难的不是修复语法,而是判断“这里到底该不该 const”——有时候删掉 const 能过编译,但可能暴露了设计缺陷。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











