右值引用未定义的行为

rvalue reference undfefined behavior

本文关键字:未定义 引用      更新时间:2023-10-16
#include<iostream>
struct Test
{
    int n ;
    ~Test(){}
    Test& operator =(int v)
    {
        n=v;
        return *this;
    }
};
Test * ptr = nullptr;
void g(Test && p)
{
    std::cout << "&&";
}

void g(Test & p)
{
    ptr = &p;
    std::cout << "&";
}
void f(Test&& t)
{
    g(t);
}
void buggy()
{
    *ptr  = 5;
}
int main()
{ 
    f(Test());
    buggy();
    std::cin.ignore(); 
} 

可以肯定的是,上面的代码会导致未定义的行为,因为我们保留临时地址?

声明

指向结构Test* ptr;的指针或您所说的"保留地址">不会导致未定义的行为。使用指向生存期已结束的对象的指针可以。

Test()main 中创建的对象的生存期在执行 f(Test()); 后立即结束。之后,无论您使用 ptr 执行什么操作都是未定义的。即使此对象的生存期已结束,此对象也很可能保留在内存中,但您不应依赖它。

您还应该查看:C++程序员应该了解的所有常见的未定义行为是什么?

是的,临时 Test(( 是在堆栈上分配的,你拿一个指向它的指针,它的析构函数在返回后被调用。之后,指针的值仍然有效,但它指向"未定义"的内存,因此所有赌注都在取消引用指针时关闭。