const int&合法而int& const非法,因const修饰对象权限而非引用本身;const引用可绑定普通/const变量及临时对象,并延长其生命周期。

const int& 是合法的,int& const 不是
常引用的本质是「用 const 限制通过该引用修改原变量的权限」,不是给引用本身加 const。所以语法必须是 const 放在类型前,而不是引用符号后。写成 int& const ra = a 会直接编译失败,错误信息类似:error: 'const' qualifiers cannot be applied to a reference。
const 引用能绑定哪些对象?
- 普通变量(权限缩小):
int b = 20; const int& rb = b;—— b 可改,rb 不可改,合法 - const 变量(权限平移):
const int a = 10; const int& ra = a;—— 两者都不可改,合法 - 字面量或临时对象(关键!):
const int& rc = 42;或const int& rd = a * 3;—— 因为临时对象具有常性,只能用 const 引用绑定;非 const 引用(int& r = 42)会报错:error: invalid initialization of non-const reference from an rvalue
为什么临时对象必须用 const 引用?
临时对象生命周期短(通常只到当前表达式结束),且 C++ 规定其具有常性(rvalue)。如果允许非 const 引用绑定,就可能出现通过引用修改一个马上要销毁的对象,或者延长其生命周期却无法保证语义安全。而 const& 显式表示“只读 + 生命周期可延长至引用作用域结束”,编译器会自动延长临时对象的生存期——这是唯一被标准允许的例外。
常见误用:把 const 引用当成“防止函数内修改参数”的银弹
比如写 void foo(const int& x),确实阻止了对 x 的赋值,但要注意:
- 如果
x绑定的是一个非 const 变量,原变量仍可能被其他途径修改(比如全局指针、其他引用) - 对类类型,
const&只禁止调用非 const 成员函数,不阻止内部 mutable 成员被修改 - 它不等价于“传入值不可变”,只是“这个引用不能改它”
真正容易被忽略的是:当你看到 const T& 出现在函数参数或返回值中,得立刻反应出它背后隐含的生命周期管理逻辑——尤其是涉及临时对象时,稍不注意就会写出悬垂引用或未定义行为。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











