Почему этот код вызывает сбой компилятора 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 *. Не уверен, что он работает для всех типов.