2013-06-21 81 views
7

有沒有辦法將類型的原始名稱與該類型的typedef名稱區分開來?區分C++ 11原始類型名稱與typedef名稱?

例如:

class C1 {}; 

typedef C1 C2; 

C1和C2二者現在命名相同的類型。在上述代碼之後,是否曾經有過一種情況,其中涉及相關類型的名稱C1的出現不能用C2代替(或反之亦然)?

回答

3

他們是完全難以區分typedef

5

typedef創建一個別名,並且它們不可區分爲一個類型。另一方面,一些特定的語法結構需要實際的類型,而不是typedef-ed(構造函數/析構函數的聲明/定義...),但這是一個不同的問題。作爲一種類型,它們是無法區分的。

+0

您是否知道這是唯一的情況(構造函數/析構函數)? ie除構造函數/析構函數之外,其他的語法構造是什麼? –

+0

@ user1131467有關'typedef'的更多信息,請參閱$ 7.1.3。關於您的評論$ 7.1.3/8和$ 7.1.6.3可能會進一步澄清。 –

+0

您可能想要閱讀_injected類name_。在'C1'裏面有一些特殊的命令來查找名字'C1'。但是由於'C2'命名同一個類,在'C2'中查找'C1'也是很特殊的。 OTOH,'C2'沒有注入'C1'。 – MSalters

2

Complete Reference

「C允許你使用關鍵字的typedef你實際上並沒有創建新的數據類型,但對於現有的,而定義一個新的名稱,明確定義了新的數據類型的名稱。類型。」

有趣的是(也許)C++ 1Y將實施一個強類型typededef(稱爲不透明的typedef),這是不可互換將基本名稱:PDF Report

+1

+1對於C++ 1Y筆記。 :) –

0

是的,有這樣的一個案件。您無法使用typedef轉發聲明類型。例如class C2;將無效。

除此之外,typedef創建一個標識類型別名,應該是完全等效的。

1

是的。由於C兼容性的原因,您可以明確地將class添加到C1:class C1 foo;,但class C2 foo;是非法的。

這樣做的原因是C爲結構和函數分別命名空間,因此您還可以使用函數void C1(int)。這不會引起歧義,因爲每個結構名稱必須以struct作爲前綴。但是如果你輸入了struct C1,那麼typedef名稱不允許爲現有函數提供別名。