Ho giocato con la deduzione del tipo di ritorno supportata in g ++ con -std = C++ 1y.
Se prototipi una funzione con un tipo di ritorno esplicito, e poi successivamente si tenta di definire la funzione con il tipo di ritorno deduzione, il compilatore si lamenta di un ambiguo vecchia dichiarazione:Deduzione del tipo di ritorno con un prototipo esplicito in C++
std::string some_function();
...
auto some_function(){ return std::string{"FOO"}; } //fails to compile
C'è un buon motivo per cui questo doesn funziona?
La mia motivazione per l'utilizzo della deduzione del tipo restituito nella definizione è di mantenere il codice pulito, ma voglio un tipo esplicito nel prototipo per motivi autodocumentanti. Raccomandazioni sulle migliori pratiche per quando e quando non usare la deduzione del tipo restituito sarebbero apprezzate :)
Per essere più chiari, vorrei rispondere a:
1. Si tratta di un errore di implementazione nel compilatore? (Sono abbastanza sicuro che non lo sia)
2. Questo tipo di detrazione può essere fatto, ma non è consentito dalla proposta allo standard? Se è così, perché no?
3. Se questo è veramente ambiguo, quali sono alcuni esempi in cui la deduzione del tipo e il tentativo di associarlo a una dichiarazione esplicita in avanti potrebbero metterti nei guai?
4. Esistono problemi specifici di implementazione più approfonditi?
5. È semplicemente una svista?
Per quando utilizzarlo, vedere [la mia domanda precedente] (http://stackoverflow.com/questions/15737223/when-should-i-use-c1y-automatic-return-type-deduction). – chris
L'ho trovato nella [proposta] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3386.html): 'auto f(); // il tipo di ritorno è sconosciuto auto f() {return 42; } // return type is int auto f(); // redeclaration int f(); // errore, dichiara una funzione diversa ». Fammi controllare N3690. – chris
Ah, N3690 ha lo stesso errore *, non può essere sovraccaricato con auto f() *. Non riesco a trovare dove lo dice, ma lo stai sovraccaricando invece di definirlo. – chris