- 論壇徽章:
- 2
|
回復(fù) 7# bruceteen
嗯,看到int (*pf)時(shí)無(wú)法確定。
甚至對(duì)int (*pf)( ... ),如果不確定其中的內(nèi)容,依然無(wú)法確定pf是:
1. 函數(shù)指針,返回int, ... 是該函數(shù)的形式參數(shù)
2. 指針,類型int*, ...是構(gòu)造函數(shù)的實(shí)際參數(shù)
直到確定 ... 的內(nèi)容了, 比如:
i) 0
那只能解釋為指針。
ii) 1024 —— 原始例子
也只能解釋為指針。然后1024這一非0整數(shù)常量初始化指針再報(bào)告一個(gè)錯(cuò)誤。
iii) 空 —— 原始后續(xù)例子
可以解釋為兩者:
a) 函數(shù)指針,形式參數(shù)列表為空
b) 指針,實(shí)際參數(shù)列表為空
于是meta-rule決定是a) 而不是b)。 (假設(shè)如果meta-rule決定是b),那編譯會(huì)成功的,同i),都是一個(gè)空int指針。)
iv) 前面3個(gè)例子確實(shí)是用腳丫子能想出來(lái)的
更奇葩的例子,人肉分析很容易中招的,也就是Eff STL里面提到的那種類型:
- typedef int* pint; // 為了可讀性(或者說(shuō)迷惑性)取個(gè)名字
- int (*p0)(pint()); // 可以解釋為用 pint() 產(chǎn)生的臨時(shí)對(duì)象(空指針)作為 p0 這個(gè)int*變量的構(gòu)造函數(shù)的實(shí)際參數(shù)
- int* q = ...;
- int (*p1)(pint(q)); // 可以解釋為用 pint(q) 產(chǎn)生的臨時(shí)對(duì)象(與q相同的指針)作為p1這個(gè)int*變量的構(gòu)造函數(shù)的實(shí)際參數(shù)
復(fù)制代碼 但同時(shí),p0與p1都可以解釋為函數(shù)指針…… 關(guān)鍵點(diǎn)是:
- void f0(pint f()) {} // 通常寫法
- void f1(pint ()) {} // 省略參數(shù)名,依然可以,這還不算太意外
- void g0(pint x ) {} // 通常的寫法
- void g1(pint (x)) {} // 多加一對(duì)括號(hào),依然可以,囧死
復(fù)制代碼 所以p0又可以解釋為函數(shù)指針,返回類型int,形式參數(shù)是一個(gè)省略名字的函數(shù)指針,該函數(shù)指針不接受參數(shù)并返回pint。
而p1可以解釋為函數(shù)指針,返回類型int,形式參數(shù)名是q類型是pint。
最終根據(jù)meta-rule,p0,p1是指針變量(后面的括號(hào)是構(gòu)造函數(shù)的實(shí)際參數(shù)列表)被排除;p0,p1都是函數(shù)指針,后面的括號(hào)都是形式參數(shù)列表。 |
|