我知道std::queue::pop()返回void。有两个原因:

  • 异常安全性:删除元素
  • 后可能会抛出异常
  • 能够return the value by reference

  • 精细。

    现在,如果我正确理解了新的C++ 11 move语义,则第二个不再是有效的参数。

    因此...阻止std::queue具有类似pop的函数返回值的唯一原因在于move构造函数是否抛出?

    我很难考虑这种移动构造函数将抛出的情况。谁知道一个例子?

    我想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()以及其他内容也是如此。

    最佳答案

    使用聪明的SFINAE技术,确实有可能只为实现无掷移动或无掷复制的数据类型提供原子无掷pop_and_move()。

    甚至还有一个noexcept()构造可用于查看是否可能抛出异常。

    特别是C++ 11中扩展SFINAE的新概念之一是,如果主体不进行编译,则该函数将不存在。因此,可以基于noexcept()实现。

    我想说,为了向后兼容,该函数需要一个新名称,因此,它可以与分别调用它们的现有功能共存,而不破坏没有语义允许的类型的容器。

    关于c++ - queue::pop现在可以返回一个值吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9191781/

    10-14 13:09
    查看更多