对于模糊的标题感到抱歉,但不确定如何表达它。所以我正在浏览boost :: asio的内部(尝试追踪一些荒谬的延迟),我注意到这样的代码点缀着:
op_queue<operation> completed_ops;
task_cleanup c = { this, &lock, &completed_ops };
(void)c; // EH?
现在从正在初始化的结构的名称,我猜它正在使用RAII在破坏上做一些步骤 - 很好,但是最后一行的目的是什么?我是否只是错过了一些完全时髦的东西?
答案 0 :(得分:19)
是否可以避免编译警告,因为未使用c
?
答案 1 :(得分:4)
它可能存在,因为它是一种跨平台的方法,让编译器不要抱怨未使用的变量。
答案 2 :(得分:3)
问题可能是关于为什么使用它,而且已经得到了回答。我将谈谈它意味着什么(OP可能已经知道,但其他人可能不知道)。至少有一个问题已被关闭,作为此问题的副本。
通常,将表达式转换为void
会计算表达式并丢弃结果(如果有)。在这种情况下,表达式为c
,类型为task_cleanup
的变量的名称(无论是什么)。
后跟分号的表达式是表达式语句。执行语句时,将计算表达式并丢弃其结果。
所以这个:
(void)c;
评估c
(因为c
只是一个非易失性声明对象,只是获取对象的值),然后丢弃结果,然后再次丢弃结果 / em>的
从语义上讲,这没有多大意义。你不妨写一下:
c;
甚至可以完全以完全相同的效果省略它。
正如其他答案已经说过的那样,目的是抑制不使用变量值的警告。没有演员表,许多编译器会警告结果被丢弃。通过演员表,大多数编译器都会假设您故意丢弃该值,并且不会对其发出警告。
这不能保证;编译器可以警告他们喜欢的任何东西。但是,转换为void
是一个足够广泛的惯例,大多数编译器都不会发出警告。
调用变量ignored
而不是c
可能是值得的,而评论肯定会有所帮助。