gpt4 book ai didi

c++ - 了解编译时断言

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:51:05 26 4
gpt4 key购买 nike

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> 为什么编译器提示 Destination_Type_Too_Narrow 的使用?

Error 4 error C2065: 'ERROR_Destination_Type_Too_Narrow' : undeclared identifier

问题2> 为什么我们总是要在宏中使用(void) 的转换?为了避免看到未使用的变量警告?

问题3>为什么STATIC_CHECK(false, XXX)会编译出错?

谢谢

最佳答案

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

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

关于c++ - 了解编译时断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28751998/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com