7

在以下程序中,全局变量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 只考虑实例化上面的代码。

哪个编译器是对的?为什么?你能引用标准吗?

备注:我的问题与这个问题不同。见评论。

4

0 回答 0