Piszę kod, w którym typ zwracany funkcji jest dość skomplikowany. Chciałbym użyć auto
do dedukcji z typu zwrotu, ale to oczywiście nie jest możliwe w deklaracji forward. Więc miałem nadzieję, że przynajmniej tylko powielać zawartości instrukcji return i wykonaj następujące czynności,Ścieżka między wstecznym typem a odjęciem zwracanym
int q = 5; // veeery complicated type
/* Declaration - the best we can do */
auto f() -> decltype(q);
/* Later, in a different file */
auto f() {
return q;
}
To daje następujący błąd w GCC 7
error: ambiguating new declaration of ‘auto f()’
note: old declaration ‘int f()’
Oczywiście mógłbym powtórzyć
auto f() -> decltype(q) {
return q;
}
w definicji (która działa), ale dlaczego powinienem potrzebować, gdy typ zwrotu jest już jednoznacznie podany przez instrukcję return
? W jaki sposób typ f
w mojej definicji jest ostatecznie bardziej niejednoznaczny niż int f()
?
nie jest standardowym guru, ale co to jest kompilator robić jeśli , zgodnie z aktualną definicją funkcji, typ końcowy i typ wyprowadzony "auto" nie pasują do siebie? Myślę, że to jest powód, dla którego gcc to zgłosi. – YiFei
Spodziewałam się, że po prostu mi powie, że to nie pasuje. To, czy dwa typy są takie same, czy nie powinno być łatwe do odpowiedzi. Ale teraz, gdy wspomniałeś o tym, całkiem interesująco, błąd spowodowany przez 'int f(); long f() {return 1; } 'jest sformułowane tak samo! –
Zgodzę się z tobą. Chciałbym również wiedzieć, czy istnieje standardowe odniesienie, które wyraźnie stwierdza, że typu zwracanego 'auto' nie można spasować z konkretną funkcją typu return (nawet jeśli pasują do siebie). – YiFei