В чем проблема?
Если я хорошо понимаю ваш вопрос, когда вы определяете splot()
, используя разные параметры шаблона для каждой пройденной лямбды, она отлично компилируется:
template <class F1, class F2>
double splot(F1 g, F2 l, double x, double sigma, double gamma) {
...
}
Но обе лямбды, которые вы используете, имеют одинаковую сигнатуру (одинаковые типы аргументов и одинаковый тип возвращаемого значения), поэтому вы ожидаете, что они будут одинакового типа, и для компиляции также будет использовано следующее определение splot()
:
template <class F>
double splot(F g, F l, double x, double sigma, double gamma) {
...
}
Но он не компилируется, и компилятор даже путает его с сообщением об ошибке , которое предполагает, что обе лямбды имеют разный тип, тогда как отображаемое имя типа указывает на тот же тип:
note: template argument deduction/substitution failed:
note: deduced conflicting types for parameter ‘F’ (‘main()::<lambda(double, double)>’ and ‘main()::<lambda(double, double)>’)
Почему возникает проблема?
Компилятор прав, несмотря на вводящее в заблуждение сообщение об ошибке.В выводе типа с F
есть ошибка: стандарт C ++ в [expr.prim.lambda.closure]/1
утверждает, что:
Тип лямбда-выражения (который также являетсятип объекта замыкания) - это уникальный , неназванный тип класса без объединения, называемый типом замыкания, свойства которого описаны ниже.
Таким образом, каждая лямбда имеет свой тип, даже если они имеют одинаковую подпись.