Резюме: Правильно ли MSVC 2013 отклонить этот MCVE, следующий за сегментом кода, даже если он делает это менее чем желательно?
При попытке создать черту типа для проверки правильности построения фигурной скобки одного типа из одного другого типа
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 из действительного кода?
Задача ещё не решена.