2010-12-03 118 views
10

我使用以下编译器:这段代码为什么会使VC++编译器崩溃?

微软的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>

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

+0

哪个VC++版本的工作? VC++拒绝编译这个。 – sharptooth 2010-12-03 09:28:51

回答

0

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

0

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

2

假设你的目标是

用于强制T_是一个指针样型decltype(*a)* - 如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; 
}