為什麼下面這種寫法沒法typedef指向const對象的指針?

為什麼下面這種寫法沒法定義指向const對象的指針?讀C++ primer的時候看到typedef指針類型有個陷阱,搜了好多答案,沒有討論這種寫法的。因為const只能用來修飾對象而非類型,所以被編譯器忽略了?

typedef const string * pstring;

const string * str1 = 「hello」;

pstring str2 = str1; //無法編譯通過


const string* str1 = new string("hello");
pstring str2 = str1;


首先感謝各位抽時間回答這個問題。

如下是自己研究了一下這個問題,整理了下心得,望各位大神不吝賜教。

其實提問裡面有一點寫錯了。

typedef const string * pstring;
const string *str1 = 「hello」; //無法編譯通過,const char *的只能不用初始化const string *的指針
pstring str2 = str1; //無法編譯通過,const string **的指針不能被pstr初始化

問題的本意如下,但是陰差陽錯的多加了個*變成上面的代碼導致無法編譯通過。其實寫成如下是可以編譯通過並運行的。

typedef const string * pstring;
const string str1 = 「hello」;
pstring str2 = str1;

這個提問的本來目的是想研究一下typedef和指針的類型重定義的問題

typedef const string * pstring;
const string str1 = 「hello」;
const string str2;
pstring str3 = str1;
str3 = str2; //允許修改指針地址
str3[1] = x; //編譯失敗,不能通過const string *類型的指針修改該指針指向的對象的值,證明pstring為typedef重定義的const string *指針類型。

輪子哥 @vczh 的示例直接new了一個string對象並且用str1指向它,str2也指向「hello」。

const string * str1 = new string("hello");
pstring str2 = str1;

繼續加上如下測試代碼。

const string str3;
str2 = str3; //允許修改指針地址
str2[1] = x; //編譯失敗,不能通過const string *類型的指針修改該指針指向的對象的值,證明pstring為typedef重定義的const string *指針類型。

總結一下,關於typedef和指針的定義問題。

1) 定義const指針類型 typedef string const * pstring; 此處有陷阱,typedef string * pstring; const pstring str1 等同於 string * const str1,而不是const string * str1;

2) 定義指向const對象的指針類型 typedef const string * pstring;


str1已經是指針了,為什麼還要取地址?


推薦閱讀:

編譯器如何得到內存空間?
PEG.js中如何消除左遞歸?
專業書籍,應該怎樣筆記?怎樣看?
Parser Combinator 在語法解析的當中處於怎樣的位置?
基於中間代碼的優化中 循環的查找演算法有哪些呢 循環的優化方法又有哪些?

TAG:編程語言 | 編譯原理 | CC | CPrimer |