在以下程序中,全局变量isCompleteType<Apple>
由 clang 和 gcc 以不同的方式初始化(位于godbolt.org上):
template <class T>
constexpr bool IsCompleteTypeHelper (decltype (sizeof (T))) { return true; }
template <class T>
constexpr bool IsCompleteTypeHelper (...) { return false; }
template <class T>
bool isCompleteType = IsCompleteTypeHelper<T> (0);
class Apple;
int main ()
{
return isCompleteType<Apple>;
}
class Apple {};
- Clang 10.0.0 初始化
isCompleteType<Apple>
为true
. - Gcc 9.3 初始化
isCompleteType<Apple>
为false
.
由于Apple
可以生成变量的定义true
是在的实例化之后isCompleteType
,所以我得出结论,编译器在初始化变量时会执行以下操作。
- Clang 考虑整个翻译单元。
- Gcc 只考虑实例化上面的代码。
哪个编译器是对的?为什么?你能引用标准吗?
备注:我的问题与这个问题不同。见评论。