有沒有辦法將類型的原始名稱與該類型的typedef名稱區分開來?區分C++ 11原始類型名稱與typedef名稱?
例如:
class C1 {};
typedef C1 C2;
C1和C2二者現在命名相同的類型。在上述代碼之後,是否曾經有過一種情況,其中涉及相關類型的名稱C1的出現不能用C2代替(或反之亦然)?
有沒有辦法將類型的原始名稱與該類型的typedef名稱區分開來?區分C++ 11原始類型名稱與typedef名稱?
例如:
class C1 {};
typedef C1 C2;
C1和C2二者現在命名相同的類型。在上述代碼之後,是否曾經有過一種情況,其中涉及相關類型的名稱C1的出現不能用C2代替(或反之亦然)?
他們是完全難以區分typedef
。
typedef創建一個別名,並且它們不可區分爲一個類型。另一方面,一些特定的語法結構需要實際的類型,而不是typedef-ed(構造函數/析構函數的聲明/定義...),但這是一個不同的問題。作爲一種類型,它們是無法區分的。
「C允許你使用關鍵字的typedef你實際上並沒有創建新的數據類型,但對於現有的,而定義一個新的名稱,明確定義了新的數據類型的名稱。類型。」
有趣的是(也許)C++ 1Y將實施一個強類型typededef(稱爲不透明的typedef),這是不可互換將基本名稱:PDF Report
+1對於C++ 1Y筆記。 :) –
是的,有這樣的一個案件。您無法使用typedef轉發聲明類型。例如class C2;
將無效。
除此之外,typedef創建一個標識類型別名,應該是完全等效的。
是的。由於C兼容性的原因,您可以明確地將class
添加到C1:class C1 foo;
,但class C2 foo;
是非法的。
這樣做的原因是C爲結構和函數分別命名空間,因此您還可以使用函數void C1(int)
。這不會引起歧義,因爲每個結構名稱必須以struct
作爲前綴。但是如果你輸入了struct C1
,那麼typedef名稱不允許爲現有函數提供別名。
您是否知道這是唯一的情況(構造函數/析構函數)? ie除構造函數/析構函數之外,其他的語法構造是什麼? –
@ user1131467有關'typedef'的更多信息,請參閱$ 7.1.3。關於您的評論$ 7.1.3/8和$ 7.1.6.3可能會進一步澄清。 –
您可能想要閱讀_injected類name_。在'C1'裏面有一些特殊的命令來查找名字'C1'。但是由於'C2'命名同一個類,在'C2'中查找'C1'也是很特殊的。 OTOH,'C2'沒有注入'C1'。 – MSalters