我正在阅读有关重载决策的内容,我发现了令我困扰的东西......在下面的代码中:
int const& MaxValue(int const& a, int const& b)
{
return a > b ? a : b;
}
void SomeFunction()
{
short aShort1 = 3;
short aShort2 = 1;
int const & r2 = MaxValue(aShort1, aShort2); // integral promotion
//is it safe to pass r2 around before function SomeFunction completes
// CallSomeOtherFunctionThatCallsSomethingElse(r2);
}
我的理解是创建了两个临时int,它们被分配在属于SomeFunction的堆栈上。 因此,当MaxValue返回时,r2引用其中一个临时变量(在这种情况下,持有值3的那个)。 因此,传递r2应该是安全的。
问题是,如果我的理解很好,这是一种标准行为(请核实)?如果没有,请解释上面代码中发生的事情。
非常感谢
答案 0 :(得分:4)
欢迎为什么隐性演员很糟糕。您现在有一个已被销毁的临时引用。希望你不想用它做任何事情。
答案 1 :(得分:3)
是的,您的理解很好,这是标准行为。
除此之外:
因此,传递r2应该是安全的。
我不明白。
//编辑
你应该在这里使用指针而不是引用来实现相同但没有问题。使用const引用传递的参数的地址只能在函数内使用,因为它可能指向对象的本地副本。
答案 2 :(得分:2)
简短回答:这是不安全的。
标准保证临时变量可以绑定到常量引用,在这种情况下,临时变量的生命周期扩展到绑定引用的生命周期。在您的特定情况下的问题是什么引用实际上绑定临时。
当您调用MaxValue( s1, s2 )
时,会创建两个int类型的临时变量,并绑定到a
中的参数参数b
和MaxValue
。这意味着那些临时工的寿命延长到功能的完成。现在,在函数的return语句中,您将对其中一个临时值进行第二次引用,而第二个引用将不会延长其生命周期。 r2
不会进一步延长对象的生命周期,而且你有一个悬空引用。
请注意,由于单独编译,编译器不可能从MaxValue
之外知道返回的引用是针对其中一个参数还是属于完全不同的非临时对象:
int const & OtherMaxValue( int const & a, int const & b ) {
static int value = 0;
value = (a > b? a : b);
return value;
}
因此无法猜测是否需要延长任何或哪个临时生命。
作为旁注,对于通过引用传递的小对象(例如所有整数类型)实际上可能比通过值传递更糟糕。此外,还有一个实际实现此功能的std::max
模板。
答案 3 :(得分:1)
您应该返回并传递简单类型的值。