54

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

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

错误:对非常量的引用的初始值必须是左值

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

4

5 回答 5

65

当您通过非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);
于 2013-07-21T10:39:26.990 回答
12

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

您可以更改void test(float *&x)为,void test(float * const &x)或者您可以完全放下指针并使用void test(float &x); /*...*/ test(nKByte);.

于 2013-07-21T10:38:06.200 回答
7

当您调用testwith&nKByte时,address-of 运算符会创建一个临时值,并且您通常不能引用临时值,因为它们是临时的。

要么不使用参数的引用,要么最好不要使用指针。

于 2013-07-21T10:36:19.590 回答
0

只需在 main 函数中test(&nKByte);替换test(nKByte);

于 2022-01-04T15:26:33.230 回答
0

简单地说,引用的初始化器应该是对象而不是它们的地址,但是如果您需要为其他对象分配引用(如上面的代码),请将此引用声明为 const。为什么是常量?因为如果不是,编译器确实认为您需要稍后修改指针本身,而不是它指向的内容。

于 2022-01-10T12:23:46.187 回答