c++ 为什么需要引用将T* 替换为T[N] [duplicate]

w41d8nur  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(183)

此问题在此处已有答案

Deducing array size in template function, pass-by-value vs pass-by-reference difference [duplicate](1个答案)
2天前关闭。
在下面的代码中:

template <typename T, size_t n> 
constexpr size_t array_size(T(&) [n]) { return n; }

引用(&)用于成功替换模板。删除引用会导致以下错误:

'template<class T, long unsigned int n> constexpr size_t array_size(T*)'
    5 | constexpr size_t array_size(T [n]) { return n; }
note: template argument deduction/substitution failed:
note: couldn't deduce template parameter 'n'

尝试使用在堆栈上声明的数组(如int test[10];)调用函数array_size时。
添加引用似乎是“强迫”编译器找到合适的替换。编译器从引用中获得了什么额外的信息,以便使用引用而不失败?

yyhrrdl8

yyhrrdl81#

C++的一个奇怪的特性是你不能把数组作为参数来传递,你只能传递数组的指针或引用,或者数据的指针,如果你试图把数组传递给函数,那么它实际上只是传递了一个指向数据的指针。

void foo(int array[3]) {}
void foo(int* ptr) {} //fails to compile because `foo(int*)` already exists.

:(

相关问题