Начальное значение ссылки С++ для не-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
, оператор-адрес создает временное значение, и вы обычно не можете ссылаться на временные значения, потому что они являются временными.
Либо не используйте ссылку для аргумента, либо еще лучше не используйте указатель.