[英]Why can I reference a member of an enum that is only forward declared
例如,給定以下內容:
// enum.h
enum class TestEnum: int {
ONE,
TWO,
THREE
};
// function.h
enum class TestEnum: int;
int TestFunction(TestEnum te = TestEnum::THREE);
// function.cpp
#include "enum.h"
#include "function.h"
int TestFunction(TestEnum te) {
return 5;
}
在我看來,這不應該編譯,因為在 function.h 中,只向前聲明了TestEnum
,編譯器無法知道TestEnum::THREE
(用作TestFunction
的默認參數)是枚舉的有效成員。 然而它確實如此。
如果我轉發聲明 class,我將無法訪問其成員,但使用枚舉似乎可以。 這是為什么? 這是按照標准“合法”的東西,還是因為我嘗試的編譯器(clang 和 gcc)的實現方式而恰好起作用?
Header 文件未編譯。 源文件是。
在 function.cpp 文件中,首先包含 enum.h,其中包含 TestEnum,然后包含 function.h。
從編譯器的角度來看,它將那些 header 文件的內容復制粘貼到源文件的頂部,因此當編譯器到達 function.cpp 文件時,您確實可以訪問枚舉的作用域值。
但是,如果包含順序首先是 function.h,最后是 enum.h,這將不起作用,因為編譯器無法知道 TestEnum 的內容(這里是枚舉的作用域值)。 這與您快進 class 並嘗試訪問其成員時的行為相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.