Начальное значение ссылки С++ для не-const должно быть lvalue

Я пытаюсь передать значение в функцию с помощью указателя ссылки, но это дало мне ошибку полностью иностранного типа

#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();
}

Ошибка: начальное значение ссылки на не-const должно быть lvalue

Я понятия не имею, что мне нужно сделать, чтобы восстановить код выше, может кто-нибудь дать мне некоторые идеи о том, как исправить этот код? спасибо:)

Ответы

Ответ 1

Когда вы передаете указатель с помощью ссылки не const, вы сообщаете компилятору, что вы собираетесь изменить это значение указателя. Ваш код этого не делает, но компилятор думает, что он делает, или планирует сделать это в будущем.

Чтобы исправить эту ошибку, объявите 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;
}

или создайте переменную, к которой вы указываете указатель на nKByte перед вызовом test:

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

Ответ 2

&nKByte создает временное значение, которое не может быть привязано к ссылке на не-const.

Вы можете изменить void test(float *&x) на void test(float * const &x), или просто можете просто отбросить указатель и использовать void test(float &x); /*...*/ test(nKByte);.

Ответ 3

Когда вы вызываете test с помощью &nKByte, оператор-адрес создает временное значение, и вы обычно не можете ссылаться на временные значения, потому что они являются временными.

Либо не используйте ссылку для аргумента, либо еще лучше не используйте указатель.