C++ che cosa fa l'errore di "valore Iniziale di riferimento per un non-const deve essere un lvalue" significa in questo caso?

0

Domanda

Io sono un principiante in C++ ed è stato incaricato di scrivere una funzione che restituisce i fattori di un numero. Di seguito, ho inserito la funzione che ho creato anche chiamato print_vector che stampa tutti gli elementi di un vettore per la Console.

Nel mio incarico, al fine di verificare se il factorize funzione di lavoro, dobbiamo usare il test_factorize la funzione che ho anche incluso. Tuttavia, il problema che ho eseguito è che il dato test_factorize non funziona a causa di un errore "Iniziale valore di riferimento per un non-const deve essere un lvalue." Non sono sicuro che cosa questo significa e perché il test_factorize esegue in un problema, in quanto l'output di factorize è un vettore e l'ingresso di print_vector è anche un vettore, quindi non vedo perché il contenuto di test_factorize causare un errore, anche se ho il sospetto che potrebbe essere qualcosa all'interno di `ridurre' la funzione che ho definito che causa questo errore.

#include <iostream>
#include <vector>

using namespace std;

void print_vector(std::vector<int>& v) {
    for (int i = 0; i < v.size(); i++) {
        cout << v[i] << " ";
    }
    cout << endl;
}

std::vector<int> factorize(int n) {
    std::vector<int> answer;
    for (int i = 1;i < n + 1; ++i) {
        if (n % i == 0) {
            answer.push_back(i);
        }
    }
    return answer;
}

void test_factorize() {
print_vector(factorize(2));
print_vector(factorize(72));
print_vector(factorize(196));
}
c++ function stdvector
2021-11-23 23:13:16
1

Migliore risposta

2

L'errore è da questa riga:

void print_vector(std::vector<int>& v) {

Siccome non includono il const parola chiave per l'argomento-tipo, si è (implicitamente) che indica che print_vector ha il diritto di modificare i contenuti del v.

Tuttavia, si sta chiamando print_vector() con un oggetto temporaneo (il vettore restituito da factorize()) come argomento, e C++ non consentire il passaggio di un oggetto temporaneo da parte di non-const riferimento, presumibilmente sulla teoria che la modifica di un oggetto temporaneo è inutile (perché la temporanea sta per essere distrutto, non appena la chiamata di funzione restituisce, in modo che le modifiche apportate non avrebbe alcun effetto) e deve, pertanto, un programmatore di errore.

In ogni caso, la soluzione è semplice, basta cambiare la vostra dichiarazione di funzione in questo modo:

void print_vector(const std::vector<int>& v) {

... e che vi permetterà di passare un riferimento-a-un-temporary-vettore ad esso.

2021-11-23 23:17:43

In altre lingue

Questa pagina è in altre lingue

Русский
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................