2010-10-27 77 views
4

C++ 03 $ 4.10-「空 指針恆定的指針 CV-限定類型的轉化是一個單一的 轉換,接着是一個指針 轉換不是序列 資格轉換(4.4)「。NULL指針轉換

這是我的理解

int main(){ 
    char buf[] = "Hello"; 
    char const *p1 = buf; // 2 step conversion process 
          // C1: char [6] to char * 
          // C2: char * to char const * (qualification conversion) 

    char const *p2 = 0; // $4.10 applies here 
} 

是我的理解(如代碼中的註釋)是否正確?

我的問題是

  1. 是什麼樣的,它值得一提的$ 4.10引述部分,顯著? 這並不是說傷害到了那裏,但是我認爲我不理解它。

  2. 這個引用的含義是什麼(重載分辨率?)?任何例子?

+0

$ 4.10便宜。 – dreamlax 2010-10-27 06:19:48

回答

3

你的理解是正確的。

而你的兩個問題的答案確實是超載分辨率。過載分辨率必須比較不同的轉換序列,才能找到最佳的轉換序列,從而選擇最佳的可行功能。當比較標準轉換序列時,其中一個規則(在13.3.3.2/3中描述)是,如果一個序列是另一個序列的適當子序列,則較短序列比較長序列更好。

例如,如果「空指針常數到CQ-合格空指針值」的轉換是一個兩步過程,然後該轉換將被視爲更糟不是「空指針常數以non-cq-qualified null-pointer-value「按照上述規則轉換。這看起來不合邏輯,至少對我而言。我更願意看到這個代碼失敗

void foo(int *); 
void foo(const int *); 
... 
foo(0); 

由於歧義而不是悄悄地解析爲foo(int *)。而且它確實失敗了,正如規範所要求的那樣。

+0

既然它是一個「const int *」的單步轉換過程,那麼它不應該調用第二個過載而不是第一個?爲什麼含糊不清? – Chubsdad 2010-10-27 06:17:25

+0

我認爲模糊是因爲'o'的類型是int。需要隱式轉換將整數0轉換爲NULL指針常量0以匹配兩個重載(因此都是CONVERSION等級)。質量認證轉換是否真的出現在這裏? – Chubsdad 2010-10-27 06:24:05

+1

@Chubsdad:呃..沒有.C++語言沒有從int類型到指針類型的隱式轉換。在這種情況下,文字'0'以特殊方式處理 - 作爲空指針常量。在這種情況下,類型'int'永遠不會起作用。 – AnT 2010-10-27 06:51:20