Oto pełny przykład:Dlaczego ogólne wywołanie lambda nie jest możliwe, ale można je zawijać w klasie?
auto callSelf = [](auto& func) {func(func);};
class wrapper : public decltype(callSelf) {
using base = decltype(callSelf);
public:
wrapper() : base(callSelf) {}
template<class T>
void operator()(T& func) {
base::operator()(func);
}
};
int main()
{
//callSelf(callSelf); // Error
wrapper w;
w(w); // OK, nice endless recursion
}
Dlaczego jest to możliwe za pomocą owijki, robiąc to bezpośrednio powoduje następujący błąd?
main.cpp:30: error: use of '<lambda(auto:1&)> [with auto:1 = <lambda(auto:1&)>]' before deduction of 'auto'
auto callSelf = [&](auto& func) {func(func);};
~~~~^~~~~~
Twój OK powinien nadal mieć błąd, ponieważ 'callSelf' ma przechwytywanie, gdy nie jest niczym lokalnym. Zredukujesz swój kod do przykładu, który wprowadza nowy błąd. – chris
@chris oh, przepraszam, caputre nie jest tu konieczne, edycja. Ale przy przechwytywaniu powinno to spowodować błąd podczas kompilacji lub źle sformułować program? – xinaiz
Ten komunikat o błędzie informuje dokładnie, dlaczego. Co jest niejasnego w tej kwestii? –