簡體   English   中英

為什么我可以引用僅前向聲明的枚舉成員

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM