理解编译时断言

时间:2015-02-26 20:21:32

标签: c++ visual-studio-2013

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)会导致编译错误?

谢谢

1 个答案:

答案 0 :(得分:0)

1:您没有尝试使用模板功能,因此编译器不会编译任何模板实现,因此断言不会消失。基本上,编译器不会为您不使用的模板发出任何代码(此功能在boost等模板库中用于不同目的。)

2:转换为void是避免未使用的变量警告的常用方法。如果断言在你的例子中没有失败,那么你的代码中会有一个未使用的变量,并且提出你可以避免的警告被认为是不好的语气。