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
相关产品推荐
相关产品推荐

