Использование функции, которая принимает шаблонные функции, прекрасно работает, когда тип является либо ссылкой на rvalue, либо не имеет ссылки, но как только я сделаю это ссылкой на lvalue, она прекратит работу.
Обратите внимание, что V в настоящее время не используетсяздесь, но все равно не удается скомпилировать в любом случае, независимо от того, используется он или нет.
using namespace std;
template <typename F, typename V = std::invoke_result_t<F, string>>
void func(F f) {
std::vector<string> v = { "a", "b", "c" };
std::for_each(v.begin(), v.end(), f);
}
int main() {
func([](string s) { return s.length(); }); // Good
// func([](string& s) { return s.length(); }); // Bad
func([](const string& s) { return s.length(); }); // Good
}
main.cpp: В функции 'int main ()':
main.cpp: 18: 46: ошибка: нет соответствующей функции для вызова функции 'func (main () ::)'
func([](string& s) { return s.length(); });
^
main.cpp: 11: 6: note :андидат: 'template void func (F) '
void func(F f) {
^~~~
main.cpp: 11: 6: примечание: сбой вывода / замены аргумента шаблона:
Я не могу сделать что-то вроде
std::invoke_result_t<F, string&>
и я не мог сделать что-то вроде
std::invoke_result_t<F, std::add_lvalue_reference_t<string>>
Последним был выстрел в темноте.Мои знания о шаблонах не так уж велики.Я искал здесь и в различных блогах / Google / и т.д., не имели большого успеха.