这是正确的吗
if (std::lock_guard lk(m_state.mtx); true) {
m_state.aborting = true;
}
和
{
std::lock_guard lk(m_state.mtx)
m_state.aborting = true;
}
百分百一致吗?
下面是关于我的问题的背景:在掌握C++17 STL中,作者给出了一个线程池的代码示例。它包含以下内容(第208页):
~ThreadPool() {
if (std::lock_guard lk(m_state.mtx); true) { // <<--- Line of interest
m_state.aborting = true;
}
m_cv.notify_all();
for (std::thread& t : m_workers) {
t.join();
}
}
标记行使用if-statement的初始化器部分创建lock_guard。在其他问题中也使用了这一点,以便将lock_guard的范围限制在if-statement上,同时保护if-statement本身的求值。
在这个例子中让我困惑的是,if语句没有适当的条件。根据if上的cppreference页面,
如果使用init-statement,则If语句等效于
{
init_statement
if ( condition )
statement-true
}
在本例中,这意味着
{
std::lock_guard lk(m_state.mtx);
if (true) {
m_state.aborting = true;
}
}
我是不是错过了一个不是100%相同的情况,还是错过了一个用if-statement编写它的好理由?
在下一页的另一个例子中使用了相同的模式,因此我认为这是故意的,而不是实际情况下的遗留问题。
它们在语义上是相同的。因为这本书似乎都是关于新的C++17特性的,所以作者使用它是有意义的。但是要小心:每一个新特性都会被滥用,直到尘埃落定,并且在使用该特性的好的和不好的方式上达成共识为止。
以我的浅见,这种方式只会增加混乱(如果块是无条件执行的,为什么会有if构造?)我更喜欢简单的街区。时间会告诉我们,作者的方式是可以接受的,还是不被接受的。或者没有人关心,或者它将永远存在争议。