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 и clang снова в порядке с этим.

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

0 ответов

Другие вопросы по тегам