当返回一个临时对象成员的const引用时会发生什么?那个对象的生命周期是多久?
例如:
struct temp
{
T m_mine;
static temp make()
{
return temp();
}
};
T const & foo()
{
return temp::make().m_mine;
}
c++98和c++11之间的行为有何不同?
当返回一个临时对象成员的const引用时会发生什么?那个对象的生命周期是多久?
例如:
struct temp
{
T m_mine;
static temp make()
{
return temp();
}
};
T const & foo()
{
return temp::make().m_mine;
}
c++98和c++11之间的行为有何不同?
const
对象或rvalue引用的引用情况。在编译之前,你的代码就存在多个错误:
static
成员函数make()
,就像它是一个static
函数一样一旦解决了这些问题:返回的引用指向一个对象的子对象,在执行return
语句之后并且在任何东西获取它之前,该对象就被销毁了。也就是说,存在一个过时的引用返回。对此引用的任何访问都将导致未定义的行为。如果你幸运的话,程序会在这一点崩溃。如果你不幸的话,它可能会做一些你希望发生的事情。例如,它可能会在程序展示给客户或投资者时决定显示侮辱。
struct temp
对象的析构函数被调用之前都是有效的。在您的示例中,您并没有返回一个临时对象,而是返回了一个对成员变量(即m_mine
)的const
引用。如果您返回对已经超出作用域的对象的引用,则这是未定义的行为。 - 101010temp
也会销毁它的成员,是吗?所以问题实际上是临时对象何时被销毁,如果您在之后尝试访问它会发生什么。 "未定义行为"意味着它可能实际上看起来工作正常,也就是说,在某些编译器、某些系统或好天气下,您可能能够从返回的T const&
中读取数据而没有错误。但您为什么要这样做呢? - David Kreturn temp;
也是非法的,也许你的意思是return temp();
? - M.M