Поскольку 2-е лямбда-выражение, возвращающее bool
, может неявно преобразовываться в std::function<void(int)>
и std::function<bool(int)>
.
std::function
имеет конструктор преобразования:
template< class F >
function( F f );
Этот конструктор не участвует в разрешении перегрузки, если f не является Вызываемым для типов аргументов Args ... и возвращаемого типа R. (начиная с C ++ 14)
Как определение Вызываемый ,
Следующие выражения должны быть действительными:
INVOKE<R>(f, std::declval<ArgTypes>()...)
, где INVOKE (f, t1, t2, ..., tN) определяется как static_cast<void>(INVOKE(f, t1, t2, ..., tN))
, если R возможно cv-квалифицирован void
, в противном случае INVOKE (f, t1, t2, ...,tN) , неявно преобразуется в R
Обратите внимание, что 2-я лямбда, возвращающая bool
, для std::function<void(int)>
, как показано выше, static_cast<void>(INVOKE(f, t1, t2, ..., tN))
является допустимым выражением (возвращаемое bool
просто конвертируется в void
). Тогда он также может неявно преобразоваться в std::function<void(int)>
и вызвать проблему неоднозначности.