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 из действующего кода?