我不知道我是否在问一个好问题,但我对此真的很好奇。除了C++中引入的这个新的r值引用之外,所有内容都可以用C术语进行翻译和理解。不是每个人都会同意我的观点,但对我而言,C++是高度复杂的C宏扩展。
好的,我想在这里知道的是,例如,如果您按如下方式查看构造函数和析构函数,
{
struct Object {
char* s;
Object(size_t n) { s = new char[n]; }
~Object() { delete[] s; }
} o(10);
}
您可以期望编译器像对待代码一样,
{
struct Object { char* s; } o;
new_Object(&o, 10); /* o->s = malloc(10); */
delete_Object(&o); /* free(o->s); */
}
我并不是说C++编译器必须执行此转换。我只是相信C++旨在以这种方式工作,以便与现有C应用程序顺利集成并吸引C开发人员。
无论如何,简单的l值引用可以理解为抽象指针,并且实际上很可能是抽象指针。对于编译器而言,
int n = 1;
int& m = n;
m = 2;
和
int n = 1;
int* m = &n;
*m = 2;
但是r值引用呢?谁能解释用C术语可以理解r值引用和
std::move
吗? 最佳答案
除了只能绑定(bind)到右值,它与左值引用相同。
一个示例可能是:
typedef struct S { int x; } S;
S foo() { S s; return s; }
S && r = foo();
最后一行的C等效项可能是:
S *p = &(foo());
除了C的规则是您不能将
&
应用于rvalues之外,并且函数调用的返回值不会在函数调用的语句结尾之后持续存在。因此,您必须编写类似以下内容的内容:
S temp = foo();
S *p = &temp;