[英]When to use an elaborated type specifier
是否有特別好的理由選擇使用精心設計的類型說明符? 例如,在某些情況下,需要使用template
或typename
關鍵字來消除依賴template
或類型的歧義。
但我想不出任何例子,如枚舉這樣的事情。 請使用以下代碼示例:
enum Foo { A, B };
void bar(Foo foo);
void baz(enum Foo foo);
為什么我可以選擇使用語法baz()
提供over bar()
(反之亦然)? 有什么含糊不清的案子嗎?
沒有理由使用這樣的說明符,除非您正在處理名稱被不同“種類”的名稱隱藏的情況。 例如,在枚舉聲明之后聲明一個名為Foo
的變量是完全合法的,因為,非正式地說,對象名稱和類型名稱存在於獨立的“名稱空間”中(有關更正式的規范,請參見3.3 / 4)
enum Foo { A, B };
int Foo;
在int Foo
聲明之后,您的bar
聲明將變為無效,而更精細的baz
聲明將保持有效。
聲明用戶定義的類型需要詳細說明的類型說明符。 一個用例是轉發聲明您的類型。 如果你有一個與enum
同名的函數,你在范圍內可見,你可能需要在函數聲明中使用詳細的類型說明符:
enum A { A_START = 0 };
void A(enum A a) {}
int main() {
enum A a;
A( a );
}
可能出現的一個示例是當您具有類型以及同名的非類型元素時。 通過使用詳細的類型說明符,您可以顯式請求類型:
struct foo {};
void foo(struct foo) {}
int main() {
struct foo f;
foo(f);
}
如果沒有詳細的類型說明符, main
foo
引用void foo(struct foo)
,而不是struct foo
類型。 現在,我不希望它出現在生產代碼中,但您只是問了一個重要的例子。 如果類型和函數(或變量)在不同的名稱空間中定義,其中先前通過查找找到非類型,則會發生同樣的情況。 你可以用上面的enum
替換struct
。
選擇使用詳細類型說明符的一個很好的理由是在頭文件中轉發聲明結構或類。 給定定義類型的標頭
// a.h
struct foo {};
您可以包含該標題來為您的函數建立原型
#include "a.h"
void foo(foo * ) ;
或使用精心制作的類型:
void foo(struct foo * ) ;
或者,使用精心設計的類型展示聲明:
struct foo ;
void foo( foo * ) ;
最后兩種方法中的任何一種都可以幫助避免您的標題逐漸退化為完全連接的網絡,其中包括任何單個標題拉入所有其他(我在軟件產品上工作,這是可悲的真實,迫使您在許多之后重建世界您可以想象的各種變化將在邏輯上被隔離。
我知道C ++ 11也允許對枚舉進行這種前向引用,這在C ++ 01編譯器中目前是不允許的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.