【发布时间】:2015-02-22 20:20:45
【问题描述】:
我正在实现一个队列,我想知道,当用户滥用容器时我该怎么办?
例如,我有两个方法 Front 和 Pop,只要不在空队列上调用它们,它们就不会抛出(我 static_assert 所包含元素的析构函数是 noexcept)。如果在空队列上调用它们,我可以对它们添加一个检查,但是我无法定义它们 noexcept。
我认为声明这些 noexcept 是有意义的,然后说在空队列上调用时行为未定义(我提供 Size 和 Empty 方法供用户检查)。然后我可以仅在调试版本上添加检查,因此它会在误用时调用终止调试并尝试在发布时破坏或取消引用丢失的元素。我想知道更好的方法是什么。
在考虑了接受的答案后,我决定遵循标准。 Vector的pop_back没有标记noexcept,和我的Pop具有相同的语义,所以我也不会标记为noexcept。通常,会尽量避免将狭义合同设置为 noexcept。
【问题讨论】:
-
当队列为空时声明行为未定义可能是有意义的,无论它是否为
noexcept。异常不一定是断言不变量的最佳方式。您的最后一段完美地描述了assert的目的。可能相关:N3963. -
Effective Modern C++ 的第 14 项的一部分也与这个确切的问题相关,将其与宽合同和窄合同的概念联系起来。
标签: c++ templates exception c++11