在以下代码中,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,为什么这里的情况不一样呢?
答案 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&
,这样就可以在复制过程中使用临时对象。