当short int []自动转换为long int []时会发生什么?

时间:2011-03-17 16:18:40

标签: c++ arrays casting

在C ++中,如果我有一个short int数组并将它作为参数传递给一个带有长整数数组的函数,那么函数是否会将short数组的每个值转换为long int或整个数组被重新解释为n / 2个元素的长整数数组?

2 个答案:

答案 0 :(得分:5)

你不能,因为没有可以使用的自动演员。

请记住,您无法通过值将数组传递给函数:数组参数实际上只是一个指针参数,因此以下两个是相同的:

void f(long a[]);
void f(long* a);

将数组传递给函数时,数组会隐式转换为指向其初始元素的指针。因此,给定long data[10];,以下两个是相同的:

f(data);
f(&data[0]);

没有从short*long*的隐式转换,因此如果将data声明为short data[10];,则会出现编译错误。

您需要使用short*long*明确地转换为reinterpret_cast,但不会将“short元素数组”转换为“一个N long个元素的数组,“它会将指向的数据重新解释为”[某些数量] long元素的数组,“这可能不是你想要的。

您需要创建一个新的long元素数组,并将short数组中的元素复制到long数组中:

short data[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

long data_as_long[10];
std::copy(data, data + 10, data_as_long);
f(data_as_long);

或者,您可以考虑将您的函数更改为可以接受指向任何类型元素数组的指针的模板:

template <typename T> void f(T*);

或者,对于更高级的解决方案,最通用的方法是让您的函数采用迭代器范围。这样,你可以传递任何类型的迭代器(包括指向数组的指针)。此外,它提供了一种自然而简单的方法来确保正确传递数组的长度,因为长度未明确传递,它由参数决定。

template <typename Iterator> void f(Iterator first, Iterator last);

const unsigned length_of_data = 10;
long data_array[length_of_data];
std::vector<long> data_vector(length_of_data);

f(data_array, data_array + length_of_data); // works!
f(data_vector.begin(), data_vector.end());  // also works!

答案 1 :(得分:1)

不,好的编译器会出错。糟糕的编译器会产生奇怪的结果。

一次重新构建单个元素很常见并且没有任何困难,但是将指针传递给期望一种类型的对象并接收另一种对象的函数是一种 I Love Lucy 类型的灾难。