很抱歉标题很模糊,但不知道该怎么表达。所以我仔细查看了boost::asio的内部结构(试图追踪一些荒谬的延迟),我注意到像这样的代码点缀在:
op_queue<operation> completed_ops;
task_cleanup c = { this, &lock, &completed_ops };
(void)c; // EH?
现在,从正在初始化的结构的名称来看,我猜它是在使用RAII来执行一些销毁步骤——好吧,但最后一行的目的是什么?我是不是错过了一些非常时髦的东西?
也许是为了避免因为未使用c
而出现编译警告?
它之所以存在,可能是因为它是一种跨平台的方法,可以让编译器不抱怨未使用的变量。
这个问题可能是关于为什么使用,这个问题已经得到了回答。我将讨论它的含义(OP可能已经知道,但其他人可能不知道)。至少有一个其他问题已作为此问题的副本关闭。
通常,将表达式强制转换为void
会计算表达式并丢弃结果(如果有)。在这种情况下,表达式为c
,即类型为task_cleanup
的变量的名称(不管是什么)。
后跟分号的表达式是表达式语句。执行语句时,将对表达式求值,并丢弃其结果。
所以这个:
(void)c;
评估c
(由于c
只是一个非易失性声明对象,它只获取对象的值),然后丢弃结果,然后再次丢弃结果。
从语义上讲,这没有多大意义。你不妨写下:
c;
或者甚至完全省略它,具有完全相同的效果。
正如其他答案已经说过的那样,其目的是抑制未使用变量值的警告。如果没有强制转换,许多编译器将警告结果被丢弃。有了强制转换,大多数编译器都会认为有意丢弃该值,并且不会对此发出警告
这并不能保证;编译器可以对任何他们喜欢的东西发出警告。但是转换为void
是一个非常普遍的约定,大多数编译器都不会发出警告。
调用变量ignored
而不是c
可能是值得的,并且注释肯定会有所帮助。