【问题标题】:Follow-up. Is return reference to x++ defined?跟进。是否定义了对 x++ 的返回引用?
【发布时间】:2011-01-24 08:47:04
【问题描述】:

我最近问了Is the behavior of return x++; defined?的问题

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

如果我要写作

class Foo
{   
  ...   
  int x;   
  int& bar() { return x++; }
};

bar 现在在哪里返回一个 int 引用,这种行为是否已定义?如果上一个问题的答案是真实的,而不仅仅是对正在发生的事情的方便抽象,那么您似乎会返回对堆栈变量的引用,该堆栈变量将在执行返回时立即销毁。

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

【问题讨论】:

    标签: c++ return defined post-increment


    【解决方案1】:

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

    【讨论】:

    • int x 是成员变量,不是临时变量
    • @John: 没错,但是函数返回的东西(x++ 的结果)临时的,因为它与(新)不同x 的值。
    • 来自 gcc:foo.h:6:在成员函数“int& Foo::bar()”中:错误:从临时类型“int&”的非 const 引用的无效初始化诠释”。 (暂时的)
    • 但是,如果将 const 声明添加到 bar - const int& Foo::bar(),则可以修复它。 gcc 会警告您返回临时文件,但不会出错。不过,我不相信它。
    • @Greg:谢谢,现在更清楚了。我错过了无形的暂时。我在想你最终还是会引用 x。
    【解决方案2】:

    您的代码将生成compilation error。但是,如果您将后增量更改为前增量,它就会起作用。 x 的值递增,然后返回对修改后的x 的引用。

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

    来自Visual C++ blog article about rvalue references

    ...C++ 不希望您意外修改临时对象...。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      相关资源
      最近更新 更多