C++ alias模板的Visual Studio 2013编译器崩溃
最近我编写了一些代码编译,结果导致窗口崩溃,并显示消息“编译器驱动程序已停止工作”。下面是仍然复制此崩溃的最小代码C++ alias模板的Visual Studio 2013编译器崩溃,c++,templates,visual-studio-2013,C++,Templates,Visual Studio 2013,最近我编写了一些代码编译,结果导致窗口崩溃,并显示消息“编译器驱动程序已停止工作”。下面是仍然复制此崩溃的最小代码 namespace _private_ { // Using SFINAE to figure out the return type of T::operator[]. // If T does not have operator[], then class T itself is used, // so that return type of T::o
namespace _private_
{
// Using SFINAE to figure out the return type of T::operator[].
// If T does not have operator[], then class T itself is used,
// so that return type of T::operator[] is calculated as
// type = esists(T::operator[]) ? typeof(T[0]) : T;
struct SquareBracesReturnType
{
private:
template<class T>
static decltype(std::declval<T>()[0]) test(T* t);
template<class T>
static T test(...);
public:
template<class T>
using type = decltype(test<T>(0));
};
}
template<class TArray>
using SquareBracesReturnType = _private_::SquareBracesReturnType::type < TArray > ;
template<class TArray, class TSubArray = SquareBracesReturnType<TArray>>
struct ArrayTypeTraits
{
using SubArrayTypeRaw = TSubArray;
using SubArrayType = typename std::remove_reference<SubArrayTypeRaw>::type;
using SubarrayTypeTraits = ArrayTypeTraits < SubArrayType, typename SquareBracesReturnType<SubArrayType> > ;
using ArrayType = TArray;
static const size_t nDim = 1 + SubarrayTypeTraits::nDim;
using ElementType = typename SubarrayTypeTraits::ElementType;
private:
template<class T, class TArg>
static TArg dummyFunc(SubArrayTypeRaw(T::*)(TArg));
public:
using IndexType = decltype(dummyFunc(&TArray::operator[]));
};
template<class T>
struct ArrayTypeTraits < T, T >
{
using ArrayType = T;
static const size_t nDim = 0u;
using ElementType = T;
};
template <class TArray>
using IndexTypeOf = typename ArrayTypeTraits<TArray>::IndexType;
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
ArrayTypeTraits<vector<double >>::IndexType j = 3u; // line 1
IndexTypeOf<vector<double >> i = 3u; // line 2
double d = 0.0; // line 3
//d = i; // <-----uncomment this to break compiler // line 4
return 0;
}
namespace\u private_
{
//使用SFINAE计算T::operator[]的返回类型。
//如果T没有运算符[],则使用类T本身,
//因此,T::运算符[]的返回类型计算为
//type=esists(T::operator[])?typeof(T[0]):T;
结构SquareBracesReturnType
{
私人:
样板
静态decltype(std::declval()[0])测试(T*T);
样板
静态T检验(…);
公众:
样板
使用类型=decltype(测试(0));
};
}
样板
使用SquareBracesReturnType=\u private\:SquareBracesReturnType::type;
样板
结构ArrayTypeTraits
{
使用SubrayTypeRaw=TSubArray;
使用subraytype=typename std::remove_reference::type;
使用SubrayTypeTraits=ArrayTypeTraits;
使用ArrayType=TArray;
静态常量大小nDim=1+子数组类型特征::nDim;
使用ElementType=typename子数组TypeTraits::ElementType;
私人:
样板
静态TArg dummyFunc(子阵列类型(T::*)(TArg));
公众:
使用IndexType=decltype(dummyFunc(&TArray::operator[]);
};
样板
结构ArrayTypeTraits
{
使用ArrayType=T;
静态常数大小nDim=0u;
使用ElementType=T;
};
样板
使用IndexTypeOf=typename ArrayTypeTraits::IndexType;
使用名称空间std;
int _tmain(int argc,_TCHAR*argv[]
{
ArrayTypeTraits::IndexType j=3u;//第1行
IndexTypeOf i=3u;//第2行
双d=0.0;//第3行
//d=i;//我认为您丢失了一些include文件或其他东西,因为g++会抛出几十个关于丢失这个、那个或另一个的错误。如果您让编译器崩溃,那就是编译器中的一个错误。毫无疑问。我在VS2013中也遇到了同样的问题。肯定是编译器错误。您应该在Connect上报告它。是的,编译器即使在恩,你给他们喂“垃圾”,更不用说正确的代码了(肘部测试曾经是一种流行的软件稳定性测试——也就是说,如果需要的话,将肘部放在键盘上多次)。