Testing C++;0x:noexcept(ndebug)用于测试?

Testing C++;0x:noexcept(ndebug)用于测试?,testing,c++11,noexcept,Testing,C++11,Noexcept,我读到有人担心过度使用noexcept可能会妨碍可测试库 考虑: T&vector::front()无例外{ assert(!empty());//如果无法证明函数不会发出异常,则不应使用noexcept标记它。就是这么简单 也就是说,noexcept(ndebug)对我来说似乎是合理的。我认为没有理由将它隐藏在宏后面。模板函数通常具有详细的noexcept条件 如果资源中的函数可以在测试模式期间抛出,那么您的程序可以在测试模式期间自动终止(实际上非常类似于隐式断言) 我能看到的唯一缺点是,如果

我读到有人担心过度使用
noexcept
可能会妨碍可测试库

考虑:

T&vector::front()无例外{

assert(!empty());//如果无法证明函数不会发出异常,则不应使用
noexcept
标记它。就是这么简单

也就是说,
noexcept(ndebug)
对我来说似乎是合理的。我认为没有理由将它隐藏在宏后面。模板函数通常具有详细的
noexcept
条件

如果资源中的函数可以在测试模式期间抛出,那么您的程序可以在测试模式期间自动终止(实际上非常类似于隐式断言)


我能看到的唯一缺点是,如果发生这种情况,您将不会得到行号和提示消息。如果您从
noexcept(true)调用
noexcept(false)
函数,编译器应该警告您
一个,所以你可能会有一些噪音。

我认为你不应该有一个修改
assert
语义的测试环境,它毕竟是标准库的一部分。它破坏了拥有
noexcept
函数的一大优势,即拥有可以依赖于调用函数的简单函数,而不是抛出概念。有了您的标志,函数永远无法确定是否抛出异常,并且通常必须编写异常,可能需要使用
noexcept
一元运算符,这会在代码中增加编译时膨胀和复杂性(c.f.使用
std::vector
重新分配,并使用nothrow move构造函数)。我会在失败的
assert
上用回溯终止我的程序,然后处理它。@litb:不,不可能“终止()并处理它”。一篇文章描述了unittest套件当然也会做负面测试--
front()
在一个空的
向量上
必须失败。如果程序终止,这是不可能的。不过,我不能完全理解你的评论:到底是什么破坏了什么?