Какую часть кода следует учитывать при создании экземпляра шаблона переменной? - PullRequest
7 голосов
/ 05 апреля 2020

В следующей программе глобальная переменная isCompleteType<Apple> инициализируется по-разному clang и g cc (в реальном времени на 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.
  • G cc 9.3 инициализирует isCompleteType<Apple> до false.

Поскольку определение Apple - что мог сделать переменную true - это после создания isCompleteType, я пришел к выводу, что компиляторы делают следующее при инициализации переменной.

  • Clang считает все Единица перевода.
  • G cc рассматривает только код выше экземпляра.

Какой компилятор прав? Почему? Не могли бы вы процитировать стандарт?

Примечание: мой вопрос отличается от этого вопроса . Смотрите комментарии.

...