В следующей программе глобальная переменная 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 рассматривает только код выше экземпляра.
Какой компилятор прав? Почему? Не могли бы вы процитировать стандарт?
Примечание: мой вопрос отличается от этого вопроса . Смотрите комментарии.