【发布时间】:2020-08-11 13:06:53
【问题描述】:
这个问题适用于堆栈和队列,但为了简单起见,我将在这里仅提及堆栈。
假设我们将非常量对象推入std::stack,当我们从堆栈中弹出时,在弹出之前将堆栈顶部的对象移动到临时变量中是否安全,如下所示:
std::stack<std::string> st;
st.emplace("asdf");
auto popped = std::move(st.top());
st.pop();
【问题讨论】:
-
@AlanBirtles 哦,我会从我的问题中编辑那部分。
-
@rafix07 在这种情况下,为什么我需要为
stack定义或派生任何东西?既然top()返回一个非常量引用,我们就不能简单地使用std::move将顶部对象转换为一个x值并使用移动赋值运算符或构造函数(在上述情况下)来初始化popped吗? -
继续我之前的评论...当您在只有一个元素的
std::stack::top上使用std::move时,调用stack::pop的语句肯定会是一种未定义的行为。它没有说明移动堆栈顶部的正确性。它只是告诉当堆栈只有一个元素并且你知道你会弹出它时这样做是多么错误! -
@brc-dd
std::move不会破坏源对象。它仍然存在,尽管处于未定义(但有效)的状态。所以,后续pop是有效的(通常是必要的!)操作,它破坏了std::move留下的“僵尸”对象。