学过C++的牛马都知道,在C++中,正常情况下左值引用只能绑定左值,右值引用只能绑定右值,const引用既可以绑定左值又可以绑定右值。但是C++有一种情况下,左值引用可以绑定右值,如下:
char &CowString::operator[](int idx){ return _pstr[idx]; }
void test1()
{
CowString str1("hello");
CowString str2 = str1;
str2[3] = 'H';
cout << str1 << "\n"; // 打印HelHo
cout << str2 << "\n"; // 打印HelHo
}
这是我在实现写时复制的时候的代码,可以看到str2[3] = 'H';能成功赋值,但是str2[3]是一个char&,如果这里还有牛马看不懂的,可以看看我下面这个代码
#include <iostream>
#include <string.h>
using std::cout;
const char* str = "hello";
char* pstr = new char[strlen(str) + 1]();
char& func()
{
return pstr[2];
}
int main(int argc, char const *argv[])
{
strcpy(pstr,str);
func() = 'M';
cout << pstr << "\n";
return 0;
}
可以看到 func() = 'M';也是可以运行的,func()返回的是一个引用