C ++对非const的引用初始值必须是左值

时间:2013-07-21 10:34:26

标签: c++ pointers reference

我正在尝试使用引用指针将值发送到函数中,但它给了我一个完全外来类型的错误

#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的引用的初始值必须是左值

我不知道我必须做些什么来修复上面的代码,有人可以给我一些关于如何修复代码的想法吗?谢谢:))

3 个答案:

答案 0 :(得分:41)

当您通过非const引用传递指针时,您告诉编译器您将修改该指针的值。您的代码不会这样做,但编译器会认为它确实存在,或计划将来执行此操作。

要修复此错误,请声明x常量

// 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);

答案 1 :(得分:6)

&nKByte创建一个临时值,该值不能绑定到对非const的引用。

您可以将void test(float *&x)更改为void test(float * const &x),也可以完全删除指针并使用void test(float &x); /*...*/ test(nKByte);

答案 2 :(得分:3)

当您使用test致电&nKByte时,地址运营商会创建临时值,而您通常无法引用临时值,因为它们是,好吧,暂时的。

要么不对参数使用引用,要么更好但不要使用指针。