考虑以下c++程序:

string construct(string&& s) {
    // Passing a r-value reference as an argument to the assignment operator
    string constructed = s;
    return constructed;
}

int main() {
    string original = "Hello";
    string temp1 = construct(std::move(original));

    printf("%s\n", original.c_str()); // Prints "Hello", so original has not changed
    return 0;
}
现在,我执行的一个小更改是在r值引用参数上调用std::move:
string constructWithMove(string&& s) {
    // Passing a cast to an r-value reference using r-value reference as an argument.
    string constructed = std::move(s);
    return constructed;
}

int main() {
    string original = "Hello";
    string temp = constructWithMove(std::move(original));

    printf("%s\n", original.c_str()); // Prints "", original is set to the empty string, WHY???
    return 0;
}
因此,看起来像将r值引用强制转换为r值引用会引起某些特殊情况。 为什么在第一种情况下原始字符串保留其值,而在第二种情况下却不保留其值?

最佳答案

string constructed = s;
因为s不是右值,所以不会引起移动。它是右值引用,而不是右值。如果有名称,则它不是右值。 Even if the variable's type is rvalue reference, the expression consisting of its name is an lvalue expression
string constructed = std::move(s);
这会导致移动,因为std::move(s)是一个右值:它是一个临时值,其类型不是左值引用。
程序中没有其他 Action (std::move不是 Action ,是强制转换)。

关于c++ - 在右值引用上调用std::move时会发生什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63105858/

10-11 16:17