为什么只能引用前向声明的枚举成员?



例如:

// 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的默认参数)是枚举的有效成员。

如果我向前声明一个类,我不能访问它的成员,但是对于枚举,我似乎可以。为什么呢?这是"合法的"吗?还是因为我尝试的编译器(clang和gcc)的实现方式而碰巧工作?

不编译头文件。源文件为。

在你的function.cpp文件中,你首先包含enumh,它包含TestEnum,然后你包含function.h。

从编译器的角度来看,它将这些头文件的内容复制粘贴到源文件的顶部,因此当编译器到达function.cpp文件时,您确实可以访问枚举的作用域值。

但是,如果包含顺序首先是function.h,最后是enumh,这将不起作用,因为编译器无法知道TestEnum的内容(这里是enum的作用域值)。当您快进一个类并尝试访问它的成员时,这是相同的行为。

最新更新