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

j'essaie d'envoyer la valeur dans la fonction en utilisant le pointeur de référence mais il m'a donné une erreur complètement de type étranger pour moi

#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 quelques idées sur la façon de réparer ce code? merci :)

24
demandé sur Mohd Shahril 2013-07-21 14:34:25

3 réponses

Lorsque vous passez un pointeur par un non-const référence, 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 constante

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

ou faire 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);
35
répondu dasblinkenlight 2014-07-25 12:22:44

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

Vous pouvez modifier void test(float *&x)void test(float * const &x) ou vous pouvez tout simplement laisser tomber le pointeur et utiliser void test(float &x); /*...*/ test(nKByte);.

5
répondu wilx 2013-07-21 10:38:06

quand vous appelez test&nKByte, l'adresse de l'opérateur crée un valeur temporaire, et vous ne pouvez pas normalement avoir des références à des valeurs temporaires parce qu'ils sont, ainsi, temporaire.

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

3
répondu Some programmer dude 2013-07-21 10:36:19