6

在查看 Visual C++ 代码库时,我发现了以下奇怪的事情。在可以在编译时评估条件的情况下使用运行时断言(检查条件并在违反条件时抛出异常):

assert( sizeof( SomeType ) == sizeof( SomeOtherType ) );

很明显,编译器将评估条件并替换有效的代码

assert( true );

什么都不做或

assert( false );

每次控制通过该行时都会引发异常。

IMO 应该使用编译时断言,原因如下:

  • 它会更早地暴露条件违规 - 在编译时 - 并且
  • 它会让更干净(因此更快更小)的机器代码被发出

看起来编译时断言是唯一正确的事情。是否有任何可能的理由在这里更喜欢运行时断言?

4

2 回答 2

17

这里没有理由更喜欢运行时断言。您应该更喜欢编译时错误而不是运行时错误,因此,考虑到两者之间的选择,永远没有理由选择运行时断言。

但是,如果静态断言不是一个选项(不知道静态断言的概念,不知道如何制作一个并且没有可用的,或者知道如何制作但没有时间),运行时断言是下一个最好的东西。

对于 C++0x,内置static_assert功能应该结束使用运行时断言的所有理由,而编译时断言将起作用。

于 2010-09-07T14:05:07.210 回答
4

没有上下文我们无法判断。在模板代码中,某些分支对于某些实例化可能是不可访问的。编译时断言是不合适的,因为这会使整个函数格式错误。一个assert(<type-dependent expression>)没有。

例如

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();
  }
}

即使运行时断言永远不会失败,断言也无法转换为静态断言。

于 2010-09-07T14:27:45.110 回答