我不小心取了一个右值的地址
感觉每次背八股的时候都会看到左右值,但一直都是纸上谈兵(原谅我项目能力太差),结果今天真遇到了(我取了一个右值的地址
- 左值:占用一定内存,有明确的可辨认地址的对象,在表达式结束后仍然存在
- 右值:左值以外的对象(类似于临时对象,在表达式结束后就会销毁)
右值是一个临时的没有明确地址的对象,可能表达式结束这个对象就被销毁了,自然取它的地址是不确定行为,C++11后我们要改用移动或转发操作
然而很有意思的是,我怎么发现这个问题的呢?是我把项目升级到C++20,C++20明确禁止了取右值的引用(在过去只是不推荐,但没有明确为Error),然后编译报错了
然后我跟同事分享这个问题,他告诉我MSVC貌似对右值有优化,我过去代码能跑只是比较幸运