Почему этот код вызывает сбой компилятора VС++?

Я использую следующий компилятор:

Microsoft Visual С++ 2010

Следующий код выдает компилятор при компиляции:

template<class T_> 
void crasher(T_ a, decltype(*a)* dummy = 0){}

int main()
{
    crasher(0);
    return 0;
}

decltype(*a)* используется для принудительного использования T_ как указательного типа - например, char*, int* и shared_ptr<int>.

Почему он падает? Это известная ошибка?

Ответ 1

Предполагая, что ваша цель

decltype(*a)* используется для принудительного использования T_ для типа типа указателя, такого как char*, int * и shared_ptr.

... вам нужен простой шаблон, а не код, который может привести к сбою компилятора:)

Вот что-то, что может сработать для вас

#include <memory>
#include <iostream>

// uncomment this "catch all" function to make select(0) compile
// int select(...){ return 0;}
template<class T>  int select(T*){ return 1;}
template<class T>  int select(std::auto_ptr<T>){ return 1;}
// add boost::shared_ptr etc, as necessary

int main()
{
    std::cout << select(0) << std::endl;
    std::cout << select(std::auto_ptr<int>()) << std::endl;
    std::cout << select(&std::cout) << std::endl;
    return 0;
}

Ответ 2

Шаблон недействителен для создания T_=int, потому что префикс operator* является сменой замещения, поэтому он должен каким-то образом потерпеть неудачу, хотя без сбоев, конечно.

Ответ 3

Я просто не понимаю, почему вы пишете decltype (* a) * вместо decltype (a). Поскольку по умолчанию 0 (ноль) является int, тогда выражение decltype (a) также будет int. Если вы хотите, чтобы var dummy был указателем на decltype (a), тогда вам нужно написать decltype (a) *. Таким образом, манекен будет иметь тип int *. Вы также должны учитывать преобразования типов. 0 может преобразовать в int *. Не уверен, что он работает для всех типов.