3

有没有办法修改此代码,以便在编译时不会收到警告?此外,这段代码是否可能导致段错误,因为它要访问以检索 main 中 x 的值的内存在操作员函数调用结束时被释放?

class A {

  int x; /* value to be post-incremented */

  public:

  A() {  /* default constructor */
  }

  A( A & toCopy ) {   /* copy constructor */
    x = toCopy.x;
  }

  A & operator++(int) {  /* returns a reference to A */

    A copy( *this );         /* allocate a copy on the stack */
    ++x;

    return copy;            /* PROBLEM: returning copy results in a warning */

  }                         /* memory for copy gets deallocated */

}; /* end of class A */

int main() {

  A object;
  object.x = 5;

  cout << (object++).x << endl;   /* Possible segfault ? */

}
4

2 回答 2

6

您需要返回一个值(不是参考):

A operator++(int) { /*...*/ }

这将解决编译器警告,您不会得到一个悬空引用。

于 2013-09-11T18:38:13.103 回答
2

后缀运算符不按引用返回,而是按值返回:

A operator++(int) {  /* returns a copy */

    A copy( *this );         /* allocate a copy on the stack */
    ++x;

    return copy;

  } 

请注意,在您的代码中,您将返回对具有 undefined-behavior 的局部变量的引用

另请注意,编译器可以通过 NRVO 轻松删除返回副本该代码非常适合 NRVO)。

于 2013-09-11T18:41:04.400 回答