std::move in function parameter 不会再用了?

std::move in function parameter will not use again?

我知道如果你用了std::move(s)那s就不能再用了,但是我有一些问题。

如果我不做move constructor/assignment operator,变量还存在吗?

// not do assignment
void test2(string &&t) {
    return;
}

void test1(string &&s) {
    test2(std::move(s));
}

int main()
{
    string s("123");
    
    test1(std::move(s));
    cout << "s: " << s << endl;
}

上面的测试似乎存在,那么这是在下面的 while 循环中使用 std::move 的最佳实践吗?

// do assignment
bool test4(string &&t) {
    if (condition) {
        return false;
    }
    
    string m = std::move(t);
    
    return true;
}

void test3(string &&s) {
    while(true) {
        if( test4(std::move(s)) ) {
            break;
        }
    }
}

似乎如果你不做 move assignment operator s 仍然存在下一个循环,当它成功时然后它做 move assignment operator 并打破循环,似乎没有逻辑错误,但是我想知道这是否是最佳做法?因为你需要小心处理数据。

I know if you use std::move(s), then the s can not use again

事实并非如此。

移出标准库类型的对象后,除非另有说明,否则其状态为“有效但未指定”,因此最好不要再次使用它,除非您知道已将其放回有用的状态(例如向量上的 .clear())。 (如果对象属于您自己的类型之一,定义这些规则。)

但是std::move什么也没有移动。它只是为触发动作准备你的表情。如果那没有发生,那么实际上什么也没有发生,您可以继续使用 s 而不必担心。

但是,您会使代码的读者感到困惑。如果您不将 std::move(s) 的结果传递给移动构造函数或移动赋值运算符,最好根本不要写它。

seems if you don't do move assignment operator the s is still exist next loop, when it success then it do move assignment operator and break the loop, There seems to be no logical error, but I want to know if this is the best practice ?

它是正确的,但有点难以阅读和理解,所以最好找到一些更清晰的结构来组织它。

Because you need to handle data carefully.

确实如此。


理想情况下,test1test2 都需要 const std::string&(因为它们都没有字符串的所有权),然后 [= 的作者也会很清楚=17=] 他们不需要't/shouldn在那里写 std::move:这将是无害的,但毫无意义。