【发布时间】:2012-02-29 19:08:11
【问题描述】:
我知道std::queue::pop() 返回void。有两个原因:
- 异常安全:删除元素后可能会抛出一些东西
- 能够return the value by reference
很好。
现在,如果我正确理解了新的 C++11 移动语义,则第二个不再是有效参数。
所以...阻止std::queue 具有类似pop 的函数返回值的唯一原因在于移动构造函数抛出的可能性?
我很难想到这样的移动构造函数会抛出什么情况。谁知道一个例子?
我猜std::stack::pop()、std::vector::pop_front()、std::vector::pop_back()、std::deque::pop_front()、std::deque::pop_back()、std::list::pop_front()、std::list::pop_back() 和其他情况也是如此。
【问题讨论】:
-
这确实是两个问题。投掷移动构造函数和返回
pop的示例。 -
我需要一个投掷移动构造函数的例子来理解为什么我们不能返回
pop。 -
那些根本没有移动构造函数的类型呢?
-
好吧,由于并非所有类型都可以有效移动,所以第二个原因仍然有效。仅仅在语言中添加移动语义并不能使所有按值返回性能明智的无操作,它是关于使用它们的类型来发挥它们的优势,并不是所有类型都可以做到这一点。第一个原因,在实践中可以想到哪些情况,以及标准允许哪些情况,some some时间点could 可能想出两个不同的东西。