web-dev-qa-db-fra.com

La valeur initiale C ++ de référence à non-const doit être une valeur l

J'essaie d'envoyer de la valeur dans la fonction à l'aide du pointeur de référence, mais cela m'a donné une erreur de type complètement étranger

#include "stdafx.h"
#include <iostream>

using namespace std;

void test(float *&x){

    *x = 1000;
}

int main(){
    float nKByte = 100.0;
    test(&nKByte);
    cout << nKByte << " megabytes" << endl;
    cin.get();
}

Erreur: la valeur initiale de référence à non-const doit être une valeur l

Je n'ai aucune idée de ce que je dois faire pour réparer le code ci-dessus, quelqu'un peut-il me donner des idées sur la façon de corriger ce code? Merci :)

32
Mohd Shahril

Lorsque vous passez un pointeur par une référence nonconst, vous dites au compilateur que vous allez modifier la valeur de ce pointeur. Votre code ne fait pas cela, mais le compilateur pense qu'il le fait ou prévoit de le faire à l'avenir.

Pour corriger cette erreur, déclarez x constant

// This tells the compiler that you are not planning to modify the pointer
// passed by reference
void test(float * const &x){
    *x = 1000;
}

ou créez une variable à laquelle vous affectez un pointeur à nKByte avant d'appeler test:

float nKByte = 100.0;
// If "test()" decides to modify `x`, the modification will be reflected in nKBytePtr
float *nKBytePtr = &nKByte;
test(nKBytePtr);
42
dasblinkenlight

Le &nKByte Crée une valeur temporaire, qui ne peut pas être liée à une référence à non-const.

Vous pouvez remplacer void test(float *&x) par void test(float * const &x) ou vous pouvez simplement supprimer le pointeur et utiliser void test(float &x); /*...*/ test(nKByte);.

8
wilx

Lorsque vous appelez test avec &nKByte, l'opérateur d'adresse crée un valeur temporaire, et vous ne pouvez normalement pas avoir de références à des valeurs temporaires car elles sont, eh bien, temporaires.

N'utilisez pas de référence pour l'argument, ou mieux encore n'utilisez pas de pointeur.

3