Невозможно неявно инициализировать std :: function

Я написал этот функтор для выполненияа также операция (&&):

// unary functor; performs '&&'
template <typename T>
struct AND
{
    function<bool (const T&)> x;
    function<bool (const T&)> y;

    AND(function<bool (const T&)> xx, function<bool (const T&)> yy) 
             : x(xx), y(yy) {}
    bool operator() ( const T &arg ) { return x(arg) && y(arg); }
};

// helper
template <typename T>
AND<T> And(function<bool (const T&)> xx, function<bool (const T&)> yy)
{
    return AND<T>(xx,yy);
}

Запись это типы аргументов конструктора:function<bool (const T&)>.

Теперь я пытаюсь создать его различными способами (внутриbig_odd_exists()):

int is_odd(int n) { return n%2; }
int is_big(int n) { return n>5; }


bool big_odd_exists( vector<int>::iterator first, vector<int>::iterator last ) 
{
    function<bool (const int &)> fun1 = is_odd;
    function<bool (const int &)> fun2 = is_big;

    return any_of( first, last, And( fun1, fun2 ) );  // instantiating an And object
}

int main()
{
    std::vector<int> n = {1, 3, 5, 7, 9, 10, 11};

    cout << "exists : " << big_odd_exists( n.begin(), n.end() ) << endl;
}

К моему удивлению, ни одно из неявных воплощенийstd::functions будет компилировать.

Вот примеры, которые я пробовал (g ++ - 4.8):

Это компилирует (явный создание экземпляраstd::function объект):
function<bool (const int &)> fun1 = is_odd;
function<bool (const int &)> fun2 = is_big;

return any_of( first, last, And( fun1, fun2 ) );
Это делаетне компилировать (неявный создание временногоstd::function объект):
return any_of( first, last, And( is_odd, is_big ) );   // error: no matching function for call to ‘And(int (&)(int), int (&)(int))’
Это компилирует (явный создание экземпляраstd::function объект):
function<bool (const int &)> fun1 = bind(is_odd,_1);
function<bool (const int &)> fun2 = bind(is_big,_1);

return any_of( first, last, And(fun1, fun2) );
Это делаетне компилировать (неявный создание временногоstd::function объект):
return any_of( first, last, And(bind(is_odd,_1), bind(is_big,_1)) );  // error: no matching function for call to ‘And(std::_Bind_helper<false, int (&)(int), const std::_Placeholder<1>&>::type, std::_Bind_helper<false, int (&)(int), const std::_Placeholder<1>&>::type)’

Насколько я понимаю,std::functions делатьне есть явные конструкторы. Итак, почему я не могу использоватьприятнее читать версии звонков?

У меня есть все тесты в:http://coliru.stacked-crooked.com/a/ded6cad4cab07541

Ответы на вопрос(2)

Ваш ответ на вопрос