为什么编译器允许修改r值对象?

时间:2014-07-12 19:47:22

标签: c++ rvalue

在以下代码中,A(100)是临时对象或r值。当成员函数尝试修改成员变量时,编译器不会抛出错误。 r值是只读的吗?

#include <iostream>

using namespace std;

class A
{
  int i;
public:
  A() {cout << "In default ctor\n";};
  A(int v) {cout << "Setting i in par-ctor to " << v << "\n"; i=v;}
  void print() {cout << "i = " << i << endl;}
  void seti(int val){i=val;print();}
};

int main()
{
  A(100).seti(200);

  return(0);
}

另外,如果需要在复制构造函数中使用const来确保不修改rvalues,为什么这里的情况不一样呢?

2 个答案:

答案 0 :(得分:3)

简单:是的,你正在创建一个临时对象,是的,它是一个右值。但是rvalues不是只读的:)

答案 1 :(得分:3)

我不知道rvalues只能读取的要求。反之亦然,可以进行修改,但对该对象的更改将与临时对象本身一样短暂(其生命周期可能通过适当的引用进行扩展)。

复制构造函数不必将其参数作为const&,它也可以是非cv引用(参见http://en.cppreference.com/w/cpp/language/copy_constructor)。

  

T类的复制构造函数是非模板构造函数,其第一个参数是T&amp;,const T&amp;,volatile T&amp;或const volatile T&amp;

一般来说,他们的参数确实为const&,这样就可以在复制过程中使用临时对象。