2016-11-30 10 views
3

Say У меня есть эта функция:Преобразование функтора объект типа функции

template <typename T> 
void foo(function<T(const T&, const T&)> op, const T& lhs, const T& rhs) { 
    cout << op(lhs, rhs) << endl; 
} 

Это legal code:

function<int(const int&, const int&)> op = plus<int>(); 

foo(op, 13, 42); 

Но когда я делаю это:

foo(plus<int>(), 13, 42) 

I получить ошибку:

No matching function for call to foo(std::plus<int>, int, int)

Почему я могу инициализировать объект типа function<int(const int&, const int&)> от plus<int>(), но я не могу передать plus<int>() в параметр типа function<T(const T&, const T&)>? Это что-то связано с шаблоном?

+3

Неявные преобразования типов не работают при выводе аргумента шаблона. – Arunmu

+1

@Arunmu Я думаю, что есть исключения из этого правила: [example] (http://melpon.org/wandbox/permlink/ld8NyDotgjK7B7WT) –

+0

@Arunmu Это ответ, потому что он работает, если я удаляю шаблон: http: // ideone.com/bfjy3p Итак, как мне узнать, что преобразование между 'plus ()' и 'function ' неявно? –

ответ

2

Цитируя стандартной секции 14.8.1.6:

Implicit conversions (Clause 4) will be performed on a function argument to convert it to the type of the corresponding function parameter if the parameter type contains no template-parameters that participate in template argument deduction.

Это не работает в вашем случае, поскольку параметры шаблона не были представлены в явном виде. Компилятор должен сделать вывод. Таким образом, согласно вышеизложенному, он не будет делать неявное преобразование из функтора в std::function.

Таким образом, вы можете сделать (как упомянуто @flatmouse в комментарии):

foo<int>(plus<int>(), 13, 42);

Это работает, потому что нет аргументов шаблона вычета, который должен быть выполнен, так как все параметры шаблона в явном виде указано. И согласно приведенной выше цитате из стандарта, для этого должно работать неявное преобразование.

+0

Спасибо за цитату из стандарта, это отличный ответ. Я соглашусь вскоре ... –

+0

Рад помочь. Благодарю. – Arunmu

 Смежные вопросы

  • Нет связанных вопросов^_^