C++ 当我在C+;中将临时int赋值给const引用时会发生什么+;?

C++ 当我在C+;中将临时int赋值给const引用时会发生什么+;?,c++,function,return,C++,Function,Return,可能重复: 假设我有一个函数f: int f(int x){return x;} const int &a=f(1); 我知道f(1)只是暂时的,我会在这句话之后被毁灭,但是 使参考常数为常数是否会使f(1)具有较长的寿命 如果是,将在哪里存储f(1) 这是否意味着x在超出范围时也没有被销毁 f(1)和x之间有什么区别 将临时变量绑定到常量&会将临时变量的生存期延长到引用的生存期。您将表达式与值混淆了 1) 表达式f(1)返回的临时值的生存期将延长。此规则对于const引用是唯一的

可能重复:

假设我有一个函数
f

int f(int x){return x;}

const int &a=f(1);
我知道
f(1)
只是暂时的,我会在这句话之后被毁灭,但是

  • 使参考常数为常数是否会使f(1)具有较长的寿命
  • 如果是,将在哪里存储
    f(1)
  • 这是否意味着
    x
    在超出范围时也没有被销毁
  • f(1)
    x
    之间有什么区别

  • 将临时变量绑定到
    常量&
    会将临时变量的生存期延长到引用的生存期。

    您将表达式与值混淆了

    1) 表达式
    f(1)
    返回的临时值的生存期将延长。此规则对于
    const
    引用是唯一的

    2) 编译器想要的任何位置,但可能在堆栈上

    3) 也许吧。这取决于编译器是复制
    x
    还是执行复制省略。因为类型是
    int
    ,所以这无关紧要


    4) 差异很大。一个是
    intf(int)
    中的局部变量的名称。这是一个左值。另一个表达式调用代码> int f(int)< /c>,并计算为rValue.< /p>您需要一本好的C++书。请看@Ben,几乎没有(甚至是好的)书涉及到这一点。@Konrad:也许他指的是最后一个问题…@NiklasB。我不确定我是否能把所有的差异都纠正过来。听起来还是一个不错的非初学者问题。@KonradRudolph我不明白的是f(1)如何返回值,因为它是一个表达式,然后它将返回一个值给f(1),那么这是否意味着它将像创建一个名为f(1)的新变量int一样:int f(1)=1;如果它延长了临时变量的生存期,那么f(1)存储在哪里,它是否有自己的地址,是否可以像普通变量一样更改?@AbdessamadBond它是否可以像普通变量一样更改(我认为)是一个悬而未决的问题;您需要一个
    const\u cast
    来更改它,即使这样,结果也可能是未定义的行为。(我认为其意图是它们是未定义的行为,但我远不能确定标准中是否出现了要求这一点的措辞。)@JamesKanze唯一一种情况是,如果对象已声明为
    const
    ,则会导致UB。就我所见,临时变量的情况从来不是这样。@pmr这是通常的情况(非类类型的右值不是cv限定值)。我知道曾经有人打算将这条规则扩展到与引用有关的临时规则;我不知道那是怎么回事。(如果你有一个
    void f(int const&)
    ,你用
    f(3)
    调用它,问题就会出现。编译器每次都需要创建一个新的临时变量吗?或者它可以假设临时变量
    3
    没有改变吗?):我知道表达式返回值,但这些值是如何存储在f(1)中的,编译器是否简单地将f(1)赋值给1,如下所示:int f(1)=1;还是别的什么?