Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Viene eseguita una copia perché auto
non dedurre i riferimenti.
Le variabili dichiarate tramite non auto
vengono mai dedotte come riferimenti di tipo. Se si inizializza una auto
variabile dal risultato di una funzione che restituisce per riferimento, viene restituita una copia. A volte questo effetto è auspicabile, ma in molti casi causa una copia involontaria.
Il lnt-accidental-copy
controllo è controllato dall'impostazione Copia accidentale nelle opzioni Stile codice C/C++. Per informazioni su come modificare questa impostazione, vedere Configurare l'linter.
Esempi
#include <string>
#include <vector>
std::string& return_by_ref();
int& return_int_by_ref();
void accidental_copy(std::vector<std::string>& strings)
{
for (auto s : strings) {} // Flagged: A new copy of each string is
// made when the vector is iterated.
auto s = return_by_ref(); // Flagged: the function returns by-reference
// but a copy is made to initialize 's'.
auto i = return_int_by_ref(); // Not flagged because no copy constructor is called.
}
Come risolvere il problema
La correzione del linter suggerisce è la modifica auto
a auto&
nella dichiarazione.
#include <string>
std::string& return_by_ref();
void accidental_copy(std::vector<std::string>& strings)
{
for (auto& s : strings) {}
auto& s = return_by_ref();
}
Osservazioni:
La correzione suggerita non è sicura da applicare in tutti i casi. La correzione può causare un errore di compilazione o modificare il comportamento del codice. È importante comprendere in che modo la correzione suggerita influisce sul codice prima di applicarla.
Nei casi in cui viene restituito un oggetto temporaneo, const auto&
è necessario per evitare un errore di compilazione. In questo caso, potrebbe essere preferibile continuare a usare auto
.
A volte una copia è intenzionale, ad esempio quando si vuole modificare la copia senza influire sull'istanza di origine, come illustrato in questo esempio.
void modifies_string(std::string& s);
void example(std::vector<std::string>& strings)
{
for (auto s : strings) {
modifies_string(s); // In this case, the copy may be intended so that
// the original strings are not modified.
}
}