invoke_result_t <> не соответствует лямбда с параметром ссылки - PullRequest
0 голосов
/ 09 февраля 2019

Использование функции, которая принимает шаблонные функции, прекрасно работает, когда тип является либо ссылкой на 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 / и т.д., не имели большого успеха.

1 Ответ

0 голосов
/ 09 февраля 2019
std::invoke_result_t<F, string>

это означает передачу F a string rvalue.И вы не можете, если F принимает ссылку lvalue.

Я не могу сделать что-то вроде

 std::invoke_result_t<F, string&>

ну да, вы можете.Сделайте это, если хотите узнать, каков результат вызова его с неконстантным lvalue.

В вашем месте использования в вашем примере кода вы передаете ему lvalue.Перегрузка string&& не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...