http://erdani.com/index.php/books/modern-c-design/errata/ 第25页:
template<bool> struct CompileTimeChecker
{
CompileTimeChecker(...);
};
template<> struct CompileTimeChecker<false> {};
#define STATIC_CHECK(expr, msg) \
{ \
CompileTimeError<expr> \
ERROR_##msg; \
(void)ERROR_##msg; }
template<class To, class From>
To safe_reinterpret_cast( From from )
{
STATIC_CHECK( sizeof( From ) <= sizeof(To ),
Destination_Type_Too_Narrow );
return reinterpret_cast<To>(from);
}
int main(int argc, _TCHAR* argv[])
{
//STATIC_CHECK( true,
// Destination_Type_Too_Narrow );
double d = 1.0;
int* i = safe_reinterpret_cast<int*>( &d );
return 0;
}
问题1&gt;为什么编译器会抱怨使用Destination_Type_Too_Narrow
?
错误4错误C2065:&#39; ERROR_Destination_Type_Too_Narrow&#39; :未宣布 标识符
问题2&gt;为什么我们总是在宏中使用(void)
的演员?
为了避免看到未使用的变量警告?
问题3&gt;为什么STATIC_CHECK(false,XXX)会导致编译错误?
谢谢
答案 0 :(得分:0)
1:您没有尝试使用模板功能,因此编译器不会编译任何模板实现,因此断言不会消失。基本上,编译器不会为您不使用的模板发出任何代码(此功能在boost
等模板库中用于不同目的。)
2:转换为void
是避免未使用的变量警告的常用方法。如果断言在你的例子中没有失败,那么你的代码中会有一个未使用的变量,并且提出你可以避免的警告被认为是不好的语气。