BOOST_STATIC_ASSERT
的工作原理如下。 存在一个类 STATIC_ASSERTION_FAILURE
,其定义如下:
namespace boost{ template <bool> struct STATIC_ASSERTION_FAILURE; template <> struct STATIC_ASSERTION_FAILURE<true>{}; }
关键特性是未定义表达式 sizeof(STATIC_ASSERTION_FAILURE<0>)
触发的错误信息,在各种编译器中往往是一致的。BOOST_STATIC_ASSERT
的其余机制只是一种将 sizeof
表达式馈入 typedef
的方法。 在这里使用宏有点难看; 然而,boost 成员花费了大量的努力来发明一种避免使用宏的静态断言,但都无济于事。 一般的结论是,静态断言在命名空间、函数和类范围内的好处大于宏的丑陋之处。