C++ 随访是对x+的返回引用+;定义

C++ 随访是对x+的返回引用+;定义,c++,return,defined,post-increment,C++,Return,Defined,Post Increment,我最近问了这个问题 结果和我预期的差不多,但让我想到了类似的情况 如果我写 class Foo { ... int x; int& bar() { return x++; } }; 其中bar现在返回int引用,是否定义了此行为?如果上一个问题的答案是真的,而不仅仅是对正在发生的事情的一个方便的抽象,那么您似乎会返回一个对堆栈变量的引用,该变量将在执行返回后立即被销毁 如果它只是一个抽象,我想知道后期增量实际上保证了什么行为。不,您不能这样做,因为这将返回

我最近问了这个问题

结果和我预期的差不多,但让我想到了类似的情况

如果我写

class Foo
{   
  ...   
  int x;   
  int& bar() { return x++; }
};
其中bar现在返回int引用,是否定义了此行为?如果上一个问题的答案是真的,而不仅仅是对正在发生的事情的一个方便的抽象,那么您似乎会返回一个对堆栈变量的引用,该变量将在执行返回后立即被销毁


如果它只是一个抽象,我想知道后期增量实际上保证了什么行为。

不,您不能这样做,因为这将返回对临时的引用。

您的代码将导致编译错误。但是,如果您将后增量更改为预增量,它将起作用。
x
的值递增,然后返回对该修改的
x
的引用

当前代码的问题是您试图修改临时对象,这是不允许的,因为它们是临时对象

由此

。。。C++不希望你意外修改临时……<
int x是一个成员变量,而不是temporary@John:这是真的,但函数返回的内容(x++的结果)是临时的,因为它与x的(新)值不同。来自gcc:foo.h:6:在成员函数“int&foo::bar()”中:错误:类型为“int&”的非常量引用的初始化无效从类型为“int”的临时文件。(这是临时的)但是,如果将const声明添加到bar-const int&Foo::bar(),则可以修复它。gcc将警告您返回临时文件,但不会出错。不过我不相信它。@Greg:谢谢,现在更清楚了。我错过了看不见的机会。我在想你最终还是会提到x。