为什么这段代码会导致VC ++编译器崩溃?

时间:2010-12-03 09:27:10

标签: c++ visual-studio-2010 c++11

我正在使用以下编译器:

  

Microsoft Visual C ++ 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>

为什么会崩溃?这是一个已知的错误吗?

3 个答案:

答案 0 :(得分:2)

假设你的目标是

  

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;
}

答案 1 :(得分:0)

该模板对于T_=int的即时性无效,因为前缀operator*是替换失败,所以它应该以某种方式失败,当然不会崩溃。

答案 2 :(得分:0)

我只是不明白为什么你写decltype(* a)*而不是decltype(a)。由于0(零)默认为int,因此表达式decltype(a)也将为int。如果你想让var dummy成为指向decltype(a)的指针,那么你必须编写decltype(a)*。这样,dummy将是int *类型。您还必须考虑类型转换。 0可以转换为int *。不确定它适用于所有类型。