一 C++中表达式的分类
传统C++的变量表达式分为左值和右值。通俗来讲,两者有着如下区别:
1.从生命周期上来看:左值就是非临时对象,那些可以在多条语句中使用的对象。所有的变量都满足这个定义,在多条代码中都可以使用,都是左值。右值是指临时的对象,它们只在当前的语句中有效;
2.左值是有名字的(通过其他具名对象间接得到的,例如通过返回引用的函数,或通过指针解引用(* 运算符)),有固定的存放数据的地址。而右值则是匿名的,相同的右值表达式多次引用,其位置(在寄存器中,或内存地址)不一定相同。
原来这左值,右值两者之间界限明显,而且不能相互转换。一个左值想要得到右值的值,必须要做复制操作(Copy Semantic)。比如说string a_string=string("hello")。string("hello")是个右值,a_string要复制这个右值的值。string("hello")本身这个临时对象不并能成为左值。但xvalue的出现使得右值到左值成为可能。
void process_value(int& i) {
std::cout << "LValue processed: " << i << std::endl;
}
void process_value(int&& i) {
std::cout << "RValue processed: " << i << std::endl;
}
int main() {
int a = 0;
process_value(a);
process_value(1);
}运行结果 : void process_value(int& i) {
std::cout << "LValue processed: " << i << std::endl;
}
void process_value(int&& i) {
std::cout << "RValue processed: " << i << std::endl;
}
void forward_value(int&& i) {
process_value(i);
}
int main() {
int a = 0;
process_value(a);
process_value(1);
forward_value(2);
} int main() {
MyString a;
a = MyString("Hello");
std::vector<MyString> vec;
vec.push_back(MyString("World"));
}MyString(const MyString& str) {
_len = str._len;
_data = new char[_len+1];
memcpy(_data, s, _len);
_data[_len] = ‘\0‘;
} MyString(MyString&& str) {
std::cout << "Move Constructor is called! source: " << str._data << std::endl;
_len = str._len;
_data = str._data;
str._len = 0;
str._data = NULL;
} MyString& operator=(MyString&& str) {
std::cout << "Move Assignment is called! source: " << str._data << std::endl;
if (this != &str) {
_len = str._len;
_data = str._data;
str._len = 0;
str._data = NULL;
}
return *this;
}template<typename T>
void swap(T& a, T& b)
{
T t(std::move(a)); // a为空,t占有a的初始数据
a = std::move(b); // b为空, a占有b的初始数据
b = std::move(t); // t为空,b占有a的初始数据
} 原文:http://blog.csdn.net/dream_you_to_life/article/details/26174377