有没有理由使用运行时断言而不是编译时断言?

sha*_*oth 5 c++ assert error-checking visual-c++

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

assert( sizeof( SomeType ) == sizeof( SomeOtherType ) );
Run Code Online (Sandbox Code Playgroud)

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

assert( true );
Run Code Online (Sandbox Code Playgroud)

什么都不做或

assert( false );
Run Code Online (Sandbox Code Playgroud)

每次控件通过该行时都会抛出异常.

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

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

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

GMa*_*ckG 16

这里没有理由更喜欢运行时断言.您应该更喜欢编译时错误而不是运行时错误,因此在两者之间选择运行时断言时,绝不会有任何理由.

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

使用C++ 0x,内置static_assert功能应该结束所有使用运行时断言的理由,其中编译时断言可以工作.