Есть ли ошибка компилятора, представленная моей реализацией свойства is_complete?

Я написал этот шаблон шаблона C ++ 11, чтобы проверить, завершен ли тип:

template  using void_t = void; template  struct is_complete : std::false_type {}; template  struct is_complete<T, void_t> : std::true_type {}; 

и протестировал его следующим образом:

 struct Complete {}; int main() { std::cout << is_complete::value << is_complete::value << '\n'; } 

Я ожидал, что тестовая программа напечатает 10 , и это результат, который я получаю, когда компилирую его с помощью clang 3.4. Однако, когда скомпилировано с gcc 4.9, оно вместо этого печатает 11 – ошибочно идентифицирует class Incomplete как полный.

Я точно не знаю, действительно ли мой код верен, но мне кажется, что даже если это неправильно, оно должно вести себя одинаково для обоих компиляторов.

Вопрос 1: Правильно ли мой код?
Вопрос 2: Я нашел ошибку в одном из компиляторов?

РЕДАКТИРОВАТЬ:

Я не прошу заменить мой код. Я спрашиваю, есть ли ошибка в gcc или clang, и является ли эта конкретная конструкция правильной.

Проблема заключается в определении void_t . Определяя это как

 template struct make_void { typedef void type;}; template using void_t = typename make_void::type; 

вместо этого дает правильный результат ( 10 ) для обоих компиляторов ( Demo ).

Я считаю, что это та же проблема, отмеченная в разделе 2.3 N3911 , в документе, предлагающем void_t и CWG issue 1558 . По сути, в стандарте неясно, могут ли неиспользуемые аргументы в специализациях шаблонов псевдонимов привести к сбою замены или просто игнорируются. Резолюция проблемы РГП, принятая на заседании Комитета в ноябре 2014 года, разъясняет, что более короткое определение void_t в вопросе должно работать, и GCC 5.0 реализует резолюцию.

  • Определить, является ли тип указателем в функции шаблона
  • Disambiguate перегруженный указатель функции участника передается как параметр шаблона
  • Как работает `void_t`
  • Почему шаблонный вывод не работает здесь?
  • Как работает `is_base_of`?
  • C ++ шаблоны Turing-complete?
  • перегрузка оператора друга << для шаблона classа
  • C ++ Template Metaprogramming - Можно ли выводить сгенерированный код?
  • Как динамически добавлять RowDefinition или ColumnDefinition в Grid со связыванием?
  • Когда следует использовать Observer и Observable
  • Изменение шаблонов в Xcode
  • Interesting Posts

    jQuery Задача перетаскивания и переполнения

    Почему сравнение double и float приводит к неожиданному результату?

    Как присоединиться к двум таблицам SQLite в приложении для Android?

    В этом контексте поддерживаются только примитивные типы или типы перечислений

    Как показать проценты, прошедшее время и приблизительное время?

    Как сделать поиск Google Chrome с помощью google.com, а не google.com.hk?

    Сохранение пространства на рабочей станции сервера Windows 2008

    Mac OSX изменяет связь файлов на файл в командной строке

    Список сортировки jquery на основе значения атрибута данных

    В eclipse не удалось ссылаться на проект библиотеки Android в другом проекте Android

    Как проверить, соответствует ли дата объекту вчера?

    Что может привести к перерыву сетевого интерфейса?

    Определите, будет ли пользователь щелкать полосу прокрутки или содержимое (onclick для собственной полосы прокрутки)

    Что означает знак вопроса в параметре типа generics Java?

    Это вредно для ноутбука, чтобы переместить его, когда он работает?

    Давайте будем гением компьютера.