Betrachten Sie den folgenden Code, inspiriert von Barry Antwort auf this Frage:keine passende Funktion std :: Vorwärts mit lambda
// Include
#include <tuple>
#include <utility>
#include <iostream>
#include <type_traits>
// Generic overload rank
template <std::size_t N>
struct overload_rank
: overload_rank<N - 1>
{
};
// Default overload rank
template <>
struct overload_rank<0>
{
};
// Prepend argument to function
template <std::size_t N, class F>
auto prepend_overload_rank(F&& f) {
using rank = overload_rank<N>;
return [f = std::forward<F>(f)](rank, auto&&... args) -> decltype(auto) {
return std::forward<F>(f)(std::forward<decltype(args)>(args)...); // here
};
}
// Main
int main(int argc, char* argv[])
{
auto f = [](int i){return i;};
prepend_overload_rank<5>(f)(overload_rank<5>(), 1);
return 0;
}
Es ist nicht wegen der Linie Kompilieren bemerkt here
, und ich verstehe nicht, warum:
With g++:
error: no matching function for call to 'forward<main(int, char**)::<lambda(int)>&>(const main(int, char**)::<lambda(int)>&)'
With clang:
error: no matching function for call to 'forward'
Ersetzen
return std::forward<F>(f)(std::forward<decltype(args)>(args)...);
von
return f(std::forward<decltype(args)>(args)...);
scheinbar macht es funktioniert, aber wieder verstehe ich nicht warum, und mein Ziel ist es, eine perfekte Weiterleitung der Funktion zu erreichen.
Hinweis: das Hinzufügen von 'mutable' behebt es (' return [f = std :: vorwärts (f)] (Rang, Auto && ... args) veränderbar -> decltype (auto) {'). 'std :: forward' ist ein Ablenkungsmanöver; Das ist einfach eine Frage der Korrektheit. –
ildjarn
'decltype (auto)' ist falsch. Du brauchst SFINAE, um anzugreifen. – Barry