You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中获取右值引用参数的地址是否为良定义行为?

右值引用取地址的良定义性分析

在接收右值引用的C++函数中获取引用的地址是良定义行为。右值引用本质仍是引用,只要它绑定的对象处于有效生命周期内,取地址操作就合法,得到的是绑定对象的内存地址。

场景一分析

void foo(int &&i) {
    cout << &i << endl;
}
int main() {
    int i = 1;
    cout << &i << endl;
    foo(std::move(i));
    return 0;
}

std::move(i)仅将左值i转换为右值引用类型,并未移动对象本身,foo中的右值引用i依然绑定到main函数里的变量i。因此两次输出的地址完全相同,这个行为是完全良定义的——引用的地址就是其绑定对象的地址,而main::i在整个过程中都处于有效生命周期。

场景二分析

void foo(int &&i) {
    cout << &i << endl;
}
int main() {
    foo(1);
    return 0;
}

传递字面量1时,编译器会临时构造一个int类型的临时对象,右值引用i会绑定到这个临时对象上。根据C++标准,绑定到右值引用的临时对象,其生命周期会被延长至该引用的作用域结束(即foo函数执行完毕前)。因此在foo内部输出的地址指向的是有效存在的临时对象,并非随机值。当foo执行完成后,该临时对象才会被销毁,对应的地址才会失效。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:57:11