1

临时对象的生命周期持续到使用时创建它的表达式的完整长度without references

考虑以下:

 class My
 {
   int i;
   public:
     void increment()
     {
       i++;
     }
 };

 My withOutConst()
 {
   return My();
 }

 const My withConst()
 {
   return My();
 }

 int main()
 {
   My ob;
   withOutConst().increment();  // Case 1
   withConst().increment();     // Case 2

   return 0;
 }

据我了解,在上述情况下,编译器会创建一个temporary对象(类型)来保存返回值。const My而且,我正在尝试修改临时对象。

(1)编译良好并且

(2)导致编译时错误并出现以下错误:

error: passing 'const My' as 'this' argument of void My::increment() discards qualifiers

这意味着基本上this是类型My而不是函数const My调用它non-const

我的问题:

我正在尝试const My通过调用non-const成员函数来修改类型的临时对象。

那么为什么我在 case(1) 中没有得到相同的错误,因为 const My在这两种情况下我都在操作该类型的对象。

我知道这与return type函数有关,但我无法完全理解,因为最后归结为 function( void My::increment()),它试图const My在这两种情况下修改临时类型。

4

5 回答 5

2

临时有一个类型,该类型可以是 const,也可以是非常量。您只能在非常量对象上调用非常量成员函数。withOutConst()产生一个临时类型MywithConst()产生一个临时类型const My

也许你有一个暂时的永远是错误的观念const?如果是这样,那就错了。

于 2013-08-20T18:09:48.253 回答
0

那么为什么我在 case(1) 中没有得到相同的错误,因为在这两种情况下我都在操作 const My 类型的对象。

这根本不是真的。

 My withOutConst()
 {
   return My();
 }

 const My withConst()
 {
   return My();
 }

withOutConst返回一个类型的对象My,同时withConst()返回一个类型的对象const My。尽管在这两种情况下您都将它们用作临时对象,但它们的基础类型Myconst My函数签名中的编码完全相同。

于 2013-08-20T18:09:52.490 回答
0
  1. 返回一个临时的非常量对象,在其上调用函数,然后超出范围。
  2. 返回一个临时 const 对象,该对象不允许调用非常量函数。

临时对象不必是 const。

于 2013-08-20T18:09:52.937 回答
0

const My据我了解,在上述情况下,编译器会创建一个临时对象(类型)来保存返回值。

withOutConst()不, is not的返回值const,因为您没有声明它const。观察到的行为由此而来。

您可能会混淆 beingconstrvalue。在许多情况下,不能修改右值;但是您可以在其中调用非常量成员函数。

于 2013-08-20T18:10:36.163 回答
0

如果这是您尝试在更复杂的代码库中执行的操作的简化版本,您仍然想在 const 对象上使用某种计数器,那么您需要将“i”变量标记为“可变” ”。像这样:

class My
{
   mutable int i;
public:
   void increment()
   {
      i++;
   }
};
于 2013-08-20T18:30:03.727 回答