在回顾Visual C ++代码库时,我发现了以下奇怪的事情。如果可以在编译时评估条件,则使用运行时断言(检查条件并在违反条件时抛出异常):
assert( sizeof( SomeType ) == sizeof( SomeOtherType ) );
显然编译器将评估条件并替换有效的代码
assert( true );
什么都不做或
assert( false );
每次控件通过该行时都会抛出异常。
IMO应该使用编译时断言,原因如下:
看起来编译时断言是唯一正确的事情。有没有可能的理由在这里选择运行时断言?
答案 0 :(得分:16)
没有理由在这里选择运行时断言。您应该更喜欢编译时错误而不是运行时错误,因此在两者之间选择运行时断言时,绝不会有任何理由。
但是,如果静态断言不是一个选项(不知道静态断言的概念,不知道如何制作一个并且没有一个可用,或者知道如何制作一个但不知道如何没有时间,运行时断言是下一个最好的事情。
使用C ++ 0x,内置的static_assert
功能应该结束所有使用运行时断言的理由,其中编译时断言可以工作。
答案 1 :(得分:4)
没有上下文我们无法分辨。在模板代码中,某些分支可能无法访问某些实例。编译时断言是不合适的,因为这会使整个函数变形。 assert(<type-dependent expression>)
没有。
E.g。
template <typename T> void foo(T t)
{
if (t < 0) {
assert(std::numeric_limits<T>::min() < 0);
T u = t - std::numeric_limits<T>::min();
}
}
断言无法转换为静态断言,即使运行时断言永远不会失败。