数组衰减到模板中的指针

数组衰减到模板中的指针

本文介绍了数组衰减到模板中的指针的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请考虑此代码:

#include <iostream>

template<typename T>
void f(T x) {
    std::cout << sizeof(T) << '\n';
}

int main()
{
    int array[27];
    f(array);
    f<decltype(array)>(array);
}

编辑注: c $ c> typeof(array),但是这是一个GCC扩展。

Editor's Note: the original code used typeof(array), however that is a GCC extension.

这将打印

8 (or 4)
108

在第一种情况下,数组明显衰减为指针,T变为 int * 。在第二种情况下,T被强制为 int [27]
是否定义了衰减/替换实现的顺序?是否有更优雅的方式强制类型 int [27] ?除了使用std :: vector?

In the first case, the array obviously decays to a pointer and T becomes int*. In the second case, T is forced to int[27].Is the order of decay/substitution implementation defined? Is there a more elegant way to force the type to int[27]? Besides using std::vector?

推荐答案

使用参数

template<typename T> void f(const T& x)
{
  std::cout << sizeof(T);
}

在这种情况下,数组类型不会衰减。

in which case the array type will not decay.

同样,如果您明确指定模板 f ,则还可以防止原始版本中的腐败c $ c> T 作为引用到数组类型

Similarly, you can also prevent decay in your original version of f if you explicitly specify the template agument T as a reference-to-array type

f<int (&)[27]>(array);

在原始代码示例中,强制使用 T 具有数组类型(即非引用数组类型,通过使用 typeof 或通过明确指定类型),不会阻止数组类型衰减。而 T 本身将代表数组类型(如你所观察到的),参数 x 将仍然被声明为指针和 sizeof x 仍会评估指针大小。

In your original code sample, forcing the argument T to have the array type (i.e. non-reference array type, by using typeof or by specifying the type explicitly), will not prevent array type decay. While T itself will stand for array type (as you observed), the parameter x will still be declared as a pointer and sizeof x will still evaluate to pointer size.

这篇关于数组衰减到模板中的指针的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-20 11:15