MSVC ICE при частичной специализации шаблона класса с decltype выражения void-cast?

Резюме: Правильно ли MSVC 2013 отклонить этот MCVE, следующий за сегментом кода, даже если он делает это менее чем желательно?

  • MSVC 2013, обновление 5
  • GCC 5.2.0
  • Лязг 3.7.0

При попытке создать черту типа для проверки правильности построения фигурной скобки одного типа из одного другого типа

B b;
A{b}; // <-- whether this line would be valid code

который работает в MSVC2013 путем адаптации кода из этот ответ в попытке обойти отсутствие поддержки MSINA выражения MSVC. Я получаю:

ошибка C1001: в компиляторе произошла внутренняя ошибка.

с местоположением

файл компилятора ‘f: \ dd \ vctools \ compiler \ cxxfe \ sl \ p1 \ c \ cast.c’, строка 725

MCVE ниже запускает этот ICE, даже в / Od:

#include <utility>
#include <type_traits>

template <typename Type, typename Arg, typename = void>
struct isBraceConsructibleImpl
: public std::false_type{};

template <typename Type, typename Arg>
struct isBraceConsructibleImpl<Type, Arg, decltype((void)Type{ std::declval<Arg>() }) >
: public std::true_type{};

int main(int, char**){}

Как видно на coliru, с gcc и clang все в порядке (даже при -O2). Однако, хотя ICE, несомненно, является ошибкой в ​​MSVC, принятие указанного кода как gcc, так и clang не является гарантией того, что в конце концов он является действительным кодом.

Удаление Arg из шаблона и замены Arg в склоне с int не воспроизводит ошибку:

#include <utility>
#include <type_traits>

template <typename Type, typename = void>
struct isBraceConsructibleImpl
: public std::false_type{};

template <typename Type>
struct isBraceConsructibleImpl<Type, decltype((void)Type{ std::declval<int>() }) >
: public std::true_type{};

int main(int, char**){}

и gcc и лязг еще раз хорошо с этим.

Является ли MSVC производит ICE из действительного кода?

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]