#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;
的指针或您所说的“保持地址” 不会导致未定义的行为。使用指向生命周期结束的对象的指针。
在 main
中由 Test()
创建的对象的生命周期在 f(Test());
执行后立即结束。在那之后,无论你使用 ptr
做什么都是未定义的。即使在其生命周期结束后,该对象很可能仍保留在内存中,但您不应该依赖它。
您还应该查看:What are all the common undefined behaviours that a C++ programmer should know about?
关于c++ - 右值引用未定义行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9349148/