invalid initialization of non-const reference of type ‘int*&’ from a temporary of type ‘int*’


被问及以下问题:

#include<iostream> 
using  namespace std; 

void func( int * &a,  int b) 

     for( int i= 0;i<b;i++) 
        a[i]+=i; 


int main() 

     int test[ 10]={ 1, 2, 3, 4, 5, 6, 7, 8, 9, 7}; 
    func(test, 4); 
    cout<< " After assignment, test is  "<<endl; 
        ...

error: invalid initialization of non-const reference of type ‘int*&’ from a temporary of type ‘int*’

we both know: 

int  func(int *a, int b); 可以正确运行。 

 理解其初始意图,想对 int指针 当一个引用 处理。

 

 

  实际上,指针与引用没有多少差别。只是调用的时候,指针需要在调用的时候,临时转换一个指针。(we heard that) 。而引用则省去了这个步骤。

  上面代码的调用处, 可以相当于以下:

int  main( void ) 

{
    int y=3;
    int &x = y;
    
    int* address_y=&y;
    int* &ref_y = address_y;
    
    int array[3] ={1,2,3};
        
    int* address_array= array;
    int* &ref_address_array = address_array;
    //int* &ref = array;//error , the same effect as func(test,4);

} 

 


  error: invalid initialization of non-const reference of type ‘int*&’ from a temporary of type ‘int*’
  这个重点似乎在于 temporary 。
  而 " 临时变量作为非const的引用参数传递" ,编译器不允许的。(ref 2 this)  http://blog.baisi.net/?116670/viewspace-4407 

 

  但如果修改以下这个转换,则可以进行编译通过并运行。
int main() 

     int test[ 10]={ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
    
     int *temp = test; /* **** 加一变量转换 ****** */
    func(temp, 4);  /* **** 用变量转换 ****** */    

    cout<< " After assignment, test is  "<<endl; 
     for( int i = 0;i< 10;i++) 
        printf( " %d\t ",test[i]);pasting
    printf( " \n ");
两者区别,我没看出来。test, temp 都是 lvalue 。似乎加一变量 没有了“ 临时 ”的效果。

 

 ======

后续:找到原因:

quote:"是因为数组名是一个地址常量,非const引用不能引用一个常量。如果把void func(int *&a, int b)改成void func(int *const &a,int b)就可以编译通过。 "

同时解释了为何上述的 int *temp 为何可以,int * temp =test;//转换成 non-const reference , match with func( int * , int ) .

:-)

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM