C++ 试图将引用的地址传递给指针

C++ 试图将引用的地址传递给指针,c++,rvalue,C++,Rvalue,为什么调用funk(&a)会产生编译错误 func(int * & data) {data++;} int main(){ int a = 5; int *p = &a; func(&a); //this gives a compile error funk(p); //this works fine } 错误:从“int*”类型的右值初始化“int*&”类型的非常量引用无效。正如错误消息所解释的,参数需要引用变量,&a不是变量,而是变量的地址。正如错误消息所解

为什么调用funk(&a)会产生编译错误

func(int * & data) {data++;}

int main(){

int a = 5;
int *p = &a;
func(&a); //this gives a compile error
funk(p);  //this works fine 
}

错误:从“int*”类型的右值初始化“int*&”类型的非常量引用无效。

正如错误消息所解释的,参数需要引用变量,
&a
不是变量,而是变量的地址。

正如错误消息所解释的,参数需要引用一个变量,而
&a
不是一个变量,它是一个变量的地址。

funk(p)此函数在何处定义?因为
a
类型为常量(地址无法更改)。您不能更改
地址(您正在函数中执行此操作)。您不能修改右值。这就是
func(&a)
正在尝试的。传递引用时,它必须是左值或具有常量限定符。@实际上,可以修改右值。示例
std::string().resize(5)。此代码是非法的,因为它试图将左值引用绑定到右值。
funk(p)此函数在何处定义?因为
a
类型为常量(地址无法更改)。您不能更改
地址(您正在函数中执行此操作)。您不能修改右值。这就是
func(&a)
正在尝试的。传递引用时,它必须是左值或具有常量限定符。@实际上,可以修改右值。示例
std::string().resize(5)。此代码是非法的,因为它试图将左值引用绑定到右值。