【问题标题】:Difference between pointer and array as template arguments指针和数组作为模板参数的区别
【发布时间】:2021-02-02 18:19:57
【问题描述】:
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[] 不也是一个指针吗?

【问题讨论】:

  • 数组不是指针。

标签: c++ pointers templates


【解决方案1】:

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

不,根本不是。数组是数组,指针是指针。数组不是指针,指针也不是数组。 int[] 是一个数组。

有一种情况是“数组是指针(而不是数组)”:在函数参数声明中,数组参数将被调整为指向该数组类型元素的指针。这种调整不适用于其他情况。模板参数是独立于函数参数的上下文,在该上下文中不会发生上述调整。

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

不同之处在于,在一种情况下,类型参数是一个数组,而在另一种情况下,类型参数是一个指针。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      • 2014-04-21
      • 1970-01-01
      • 2011-08-01
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多