我不知道我是否在问一个好问题,但我对此真的很好奇。除了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;

10-07 21:06