临时对象, vector<int>(c).swap(c)
vector的这种swap shrink调用到了临时对象的非const方法, 感觉比较诡异;
简化一下:
struct Foo{
int a;
void change(){a=42;}
};
我用vc7.1试了下:
Foo().change();是允许的;
而:
Foo().a = 42;
却要求 error C2106: '= ' : left operand must be l-value
哪位解释下, 或者哪本书里讨论了这个冬冬?
thanks,
[解决办法]
普通类型临时变量是不能更改的.
但是复杂类型可以.
[解决办法]
右值对象(r-value object)并不等价于常量对象(const object)。
右值对象(或右值表达式)不可以放在等号左边,而常量对象(或常量表达式)既不可以被放在等号左边,也不可以经由它调用非const成员函数。
——差不多所有的就只有这些了。
C++语言并没说右值对象上不能调用任何非const成员函数。
除非那个右值对象同时也是const对象,比如对于函数:
const string get_string();
而言,下面的
get_string().clear();
是错误的。
而如果是:
string get_string();
则没有问题。