Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过引用传递和返回参数时的积分提升?_C++_Pass By Reference_Parameter Passing_Integer Promotion - Fatal编程技术网

C++ 通过引用传递和返回参数时的积分提升?

C++ 通过引用传递和返回参数时的积分提升?,c++,pass-by-reference,parameter-passing,integer-promotion,C++,Pass By Reference,Parameter Passing,Integer Promotion,我正在阅读一些关于重载解析的内容,在以下代码中发现了一些困扰我的问题: 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);

我正在阅读一些关于重载解析的内容,在以下代码中发现了一些困扰我的问题:

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应该是安全的

问题是,如果我的理解是好的,这是一个标准的行为(请验证)?如果没有,请解释上面代码中发生了什么


非常感谢

是的,您的理解很好,这是标准行为

除此之外:

因此,通过r2应该是安全的

我不明白

//编辑


在这里,您应该使用指针而不是引用来实现相同但没有问题的目标。仅在函数中使用const引用传递的参数的地址是可以的,因为它可能指向对象的本地副本。

欢迎了解隐式强制转换的原因。您现在有了一个对临时文件的引用,该文件已被销毁。希望您不想对它做任何事情。

对于简单类型,您应该返回并传递值。

简短回答:它不安全

该标准保证临时变量可以绑定到常量引用,在这种情况下,临时变量的寿命将扩展到绑定引用的寿命。在您的特殊情况下,问题是什么引用实际绑定了临时

调用
MaxValue(s1,s2)
时,将创建两个int类型的临时变量,并将其绑定到
MaxValue
中的参数参数
a
b
。这意味着这些临时人员的寿命将延长到完成该功能。现在,在函数的return语句中,您正在对其中一个临时变量进行第二次引用,并且该第二次引用不会延长生存期
r2
不会进一步延长对象的生存期,并且您有一个悬空引用

注意,由于单独编译,编译器不可能从外部知道返回的引用是指向某个参数还是指向一个完全不同的非临时对象:

int const & OtherMaxValue( int const & a, int const & b ) {
   static int value = 0;
   value = (a > b? a : b);
   return value;
}
因此,它不可能猜测是否有或哪些临时生命需要延长


作为旁注,对于小对象(例如所有整数类型),按引用传递实际上可能比按值传递更糟糕。另外,已经有一个
std::max
模板实际实现了此功能。

我同意您的答案,并对其进行了限定。