作者jamod (jasper)
看板Programming
標題[問題] C++ constant reference的小疑問
時間Tue Aug 9 10:33:02 2016
小弟想請教一些觀念性的問題,最近遇到一個錯誤是
int i = 1;
int *pi = &i;
const int *& rpci = pi; // error C2440: 'initializing': cannot convert from 'int *' to 'const int *&'
我對這段有段小疑惑,因為下面這段的寫法是合法的
int i = 1;
const int &ci = i;
那為什麼換成constant pointer reference就不行呢?
上網查了一下,有得出下面可能發生的錯誤
const int i = 99;
int *pi;
const int*& rpci = pi; //if pass
rpci = &i;
*pi = 10;
如果允許const int* reference to int*,
那就可以透過pi來修改常數i,所以不給過...
但是我很好奇const int* 是否能reference一個int* ?
這樣在語法上到底合不合法(雖然有隱患)?
因為const int Reference to int實際上是ok的,
所以我懷疑是不是VC++自己把我擋掉的?
麻煩請各位高手指點一下@@ 感謝!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.249.2.10
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Programming/M.1470709984.A.AD4.html
※ 編輯: jamod (60.249.2.10), 08/09/2016 10:34:40
1F:→ CindyLinz: 你的「能不能」包含 explicit 轉型嗎? 112.121.78.5 08/09 13:04
不包含好了@@,我其實只是比較好奇這段的語法是否合法?
因為我曾經因為const int**和 int**的問題被VC++的compiler婊過,
所以有點混亂...
※ 編輯: jamod (60.249.2.10), 08/09/2016 13:19:12
※ 編輯: jamod (60.249.2.10), 08/09/2016 13:22:25
2F:推 jeff7037: *&這樣的寫法能放到函式的引數。但這樣 114.24.38.28 08/09 21:20
3F:→ jeff7037: 不行,可見Primer C++第7章函式271頁。 114.24.38.28 08/09 21:23
4F:→ jeff7037: 第四章指標p121頁。 114.24.38.28 08/09 21:25
5F:→ jeff7037: *&在函式裡,意為對傳來的引數deference 114.24.38.28 08/09 21:27
6F:→ jeff7037: 可理解為取值。然不可在定義式這樣寫*& 114.24.38.28 08/09 21:28
7F:推 jeff7037: 你有對*&賦值的動作。 114.24.38.28 08/09 21:30
感謝指點,但我還是有點小疑惑,以上方程式碼而言:
int *pi;
const int*& rpci = pi;
雖然會出錯,但是只要把第二行的const拿掉就能正確編譯了,
實際上我應該就是單純的對一個int pointer的別名進行初始化吧?@@
甚至寫成
const int*const & rpci = pi;
也是能正確編譯的,我不太能理解為何將要reference的pointer指定為const就能編譯?
有點好奇是compiler雞婆把我擋下的呢?還是在語法規則上就是不合法了?
※ 編輯: jamod (60.249.2.10), 08/10/2016 09:38:52
8F:推 shietsd: non-const reference只能用non-const綁定 219.84.235.190 10/16 15:46
9F:→ shietsd: 但con-ref可以綁所有的 const/non-const 219.84.235.190 10/16 15:47
10F:推 shietsd: const int &ci = i 表示 ci 不能改i的值 219.84.235.190 10/16 15:54
11F:→ shietsd: 但 i 自己可以改,你跑跑看就知道 219.84.235.190 10/16 15:54