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.
确实如此。
理想情况下,test1
和 test2
都需要 const std::string&
(因为它们都没有字符串的所有权),然后 [= 的作者也会很清楚=17=] 他们不需要't/shouldn在那里写 std::move
:这将是无害的,但毫无意义。
我知道如果你用了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.
确实如此。
理想情况下,test1
和 test2
都需要 const std::string&
(因为它们都没有字符串的所有权),然后 [= 的作者也会很清楚=17=] 他们不需要't/shouldn在那里写 std::move
:这将是无害的,但毫无意义。