微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

指针和数组作为模板参数的区别

如何解决指针和数组作为模板参数的区别

template<typename T,typename U = int>
struct A {};

template<typename T,typename U>
struct A<T*,U> {};

template<typename T,typename U>
struct A<T[],U> {};

int main()
{
    A<int*> m; // m: A<int*,int>
    A<int[]> n; // n: A<int[],int>

    return 0;
}

这里int[]int*作为模板参数有什么区别? int[]也不只是一个指针吗?

解决方法

int[]也不只是一个指针吗?

不,事实并非如此。数组是数组,指针是指针。数组不是指针,指针也不是数组。 int[]是一个数组。

在某些情况下,“数组是指针(而不是数组)”:在函数参数delcaration中,数组参数将被调整为指向该数组类型元素的指针。此类调整不适用于其他情况。模板参数是与函数参数分开的上下文,在这种情况下,不会发生上述调整。

这里int[]int*作为模板参数有什么区别?

区别在于,在一种情况下,类型参数是一个数组,在另一种情况下,类型参数是一个指针。

,

事实上,这些是不同的类型。您可以说出来,因为它们做了不同的事情:

const char* a = "hi";
const char[] b = "hi";

第一个在堆栈上分配一个指针(字面量可能在其他地方),第二个在堆栈上分配整个字面量作为数组。因此,尽管它们可以隐式地相互转换,但是它们是不同的类型。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。