0

std::remove_extent我对(visual studio 11)的实施有疑问

    template<class _Ty>
        struct remove_extent
        {
        typedef _Ty type;
        };

    template<class _Ty, unsigned int _Ix>
        struct remove_extent<_Ty[_Ix]>
        {
        typedef _Ty type;
        };

    template<class _Ty>
        struct remove_extent<_Ty[]> //what for?
        {
        typedef _Ty type;
        };

我刚试过这个:std::cout << typeid(int[]).name() << '\n';

输出是:int [0],所以我假设_Ty[]代表_Ty[0].

但是专攻的目的是什么_T[0],我认为第二种情况已经处理了。

另外,我真的怀疑 ifT [0]是一个有效的类型,如果是这样,在这种情况下你应该使用它吗?

4

2 回答 2

5

T[]是一个未知大小的数组;一个不完整的类型,不同于任何大小的数组类型。似乎您的编译器有效但有点令人困惑,使用否则无效T[0]作为类型的字符串表示。

因此需要这种特化,因为它不会被大小数组的部分特化所涵盖。

如果是这样,在哪种情况下你应该使用它?

您不会使用大小为零的数组,因为这不是有效类型。

您可以在不同的地方使用不完整的类型(包括未知大小的数组),例如变量声明。例如:

extern int array[];                           // declaration with incomplete type
std::remove_extent<decltype(array)>::type x;  // OK, gives "int"
array[3] = 42;                                // OK, array decays to pointer

template <size_t N> size_t size(int (&a)[N]) {return N;}
std::cout << size(array) << "\n";             // Error, needs complete type

// somewhere else
int array[17];                                // definition with complete type
std::cout << size(array) << "\n";             // OK, size is known
于 2013-05-21T12:09:23.560 回答
1

输出是:int [0],所以我假设_Ty[]代表_Ty[0].

不,这不一样,正如迈克西摩的回答所说。type_info如果它说它是相同的,它看起来像是你的编译器名称的问题。

另外,我真的怀疑 ifT [0]是一个有效的类型,如果是这样,在这种情况下你应该使用它吗?

一些编译器允许它作为扩展,所以在这样的编译器上是可以的:

typedef int empty_array[0];   // typedef for int[0]
int* p = new empty_array;
于 2013-05-21T12:14:37.697 回答