【发布时间】:2019-06-03 05:47:35
【问题描述】:
我最近遇到了一个代码 sn-p,看起来像这样:
bool MyClass::do_work()
{
bool success = true;
for (auto const& worker : m_workers)
{
success &= worker.do_work(); // worker.do_work() returns a bool
}
return success;
}
如果我理解正确,如果所有工作人员返回 true,则该函数返回 true,如果任何工作人员返回 false,则返回 false。但是,它总是评估所有工作人员(这是所需的)。不涉及短路评估,因为使用了位运算符&=,而不是逻辑运算符&&。
这种行为是否得到保证?准确地说,是否保证按位& 总是计算两个操作数,即使它们是bool 类型?我遇到了许多关于 && 的保证短路评估的 SO 答案,但没有一个声明保证 & 的非短路评估。
如果这种行为得到保证,这是一种好的编程风格吗?看了一眼就明白了这个功能,因为我之前没见过这种风格,一开始我很困惑是否涉及短路评估。
还有比以下更好的选择吗?
bool MyClass::do_work()
{
bool success = true;
for (auto const& worker : m_workers)
{
if (!worker.do_work())
{
success = false;
}
}
return success;
}
【问题讨论】:
-
我会说这是一种非常令人困惑的风格:似乎很容易忽视无短路效应。
-
运算符的所有操作数通常都会被求值,
&&、||和?:运算符是例外。该标准甚至提到&&“与&不同,&&保证从左到右的评估:如果第一个操作数是false,则不会评估第二个操作数。”。至于这是否是好的编程风格,这是基于意见的。 -
@You 我认为标准不能保证
all_of不会发生短路,那真的很奇怪。 -
“有没有更好的选择 [...]?” Some 会争辩,是的(?):
std::count_if(m_workers.begin(), m_workers.end(), [](const auto& worker) { return !worker.do_work(); }) == 0; -
或者
success = worker.do_work() && success;,如果你想坚持使用命令式循环。
标签: c++ c++11 coding-style language-lawyer