为什么需要这个强制转换为bool?

qdi*_*dii 36 c++ gcc casting standard-library

template<typename InputIterator, typename Predicate>
inline InputIterator
find_if(InputIterator first, InputIterator last, Predicate pred, input_iterator_tag)
{
    while (first != last && !bool(pred(*first)))
         ++first;

    return first;
}
Run Code Online (Sandbox Code Playgroud)

我在GCC 4.7.0附带的C++标准库的实现的源代码中遇到了这个片段.这是find_if输入迭代器的特化.我清理了前导下划线,使其更具可读性.

他们为什么bool在谓词上使用强制转换?

Sim*_*ple 31

原因是只是写入!pred(*first)可能导致调用过载operator!而不是调用explicit operator bool.

有趣的是,采取了这一措施pred,但operator&&仍然可以在提供的实施中选择过载.first != last需要更改bool(first != last)为还可以防止此过载.

  • 我认为如果`operator &&`被重载,由于在最后一次迭代(没有短路)中解除引用结束迭代器,行为将是未定义的.所以也许实现可以自由地忽略这个问题. (7认同)

Jam*_*nze 12

该标准仅要求谓词可以在可以转换为a的上下文中使用bool.据推测,一个"谓词"对象可能有一个operator bool功能,它做了正确的事情,而一个operator!功能做了一些完全不相关的事情.(当然,这将是一个可怕的设计,但标准要求库按指定的方式工作,无论用户代码有多糟糕.)所以g ++转换为bool,然后使用!转换的结果(只有构建) -in运算符可以申请).