如果我有课A和功能
A f(A &&a)
{
doSomething(a);
return a;
}
A g(A a)
{
doSomething(a);
return a;
}
Run Code Online (Sandbox Code Playgroud)
返回时,拷贝构造函数被调用a的f,但返回时移动的构造函数使用g.但是,根据我的理解,f只能传递一个可以安全移动的对象(临时或标记为可移动的对象,例如,使用std::move).有什么例子,当从返回时使用移动构造函数是不安全的f吗?为什么我们要求a有自动存储时间?
我在这里阅读了答案,但最顶层的答案只表明规范不应允许在传递a给函数体中的其他函数时移动; 它没有解释为什么在返回时移动是安全的g但不是安全的f.一旦我们到达return语句,我们就不再需要a了f.
所以我理解临时表可以在完整表达结束之前访问.然而,从f仍然返回时的行为似乎违背了根深蒂固的语义,即移动临时或xvalue是安全的.例如,如果您调用g(A()),临时将移动到参数中,g即使可能存在对某处临时存储的引用.如果我们g使用xvalue 调用,也会发生同样的情况.因为只有temporaries和xvalues绑定到rvalue引用,所以看起来我们a在返回时仍应该移动的语义是一致的f,因为我们知道a传递了临时或xvalue.