C++ 推导模板函数中的数组大小,传递值与传递引用之差

C++ 推导模板函数中的数组大小,传递值与传递引用之差,c++,templates,C++,Templates,为什么它不能为传递值计算出\u size,而能够为传递引用1计算出呢?在log\u seq\u pbv中,您试图让模板自动推断C样式数组x的大小,并在每种情况下定义不同的函数。这是行不通的,因为C样式数组不知道自己的大小。您需要将数组的大小作为实际参数传递给函数 在log\u seq\u pbr中,语法T(&x)[\u size]是一种非常特殊的语法,专门用于声明对已知大小数组的引用(有关更多详细信息)。这是使用C样式数组执行本文尝试的操作的唯一方法,因为它为编译器提供了选择正确模板参数所需的信

为什么它不能为传递值计算出
\u size
,而能够为传递引用1计算出呢?

log\u seq\u pbv
中,您试图让模板自动推断C样式数组
x
的大小,并在每种情况下定义不同的函数。这是行不通的,因为C样式数组不知道自己的大小。您需要将数组的大小作为实际参数传递给函数

log\u seq\u pbr
中,语法
T(&x)[\u size]
是一种非常特殊的语法,专门用于声明对已知大小数组的引用(有关更多详细信息)。这是使用C样式数组执行本文尝试的操作的唯一方法,因为它为编译器提供了选择正确模板参数所需的信息

但是,在这里使用C++更好,因为那个容器的整个点是它自己知道数组大小的数组。下面是一个例子:

#包括
#包括
使用名称空间std;
模板
无效打印元素(常量数组和a)
{
对于(大小i=0;icout模板是一个麻烦事,不能按值传递数组。请注意错误消息中
log\u seq\u pbv()
的签名:
void log\u seq\u pbv(const T*)
。在函数参数中,
const T x[\u size]
只是
const T x[]
的语法糖(忽略
\u size
),这反过来又只是
const T*x
的糖。传递一个简单的指针,任何大小信息都会丢失,因此无法推导
\u size
模板参数。如果需要这样做,请改用
std::array
#include <iostream>


/* prints sequentially the elements of an array */
template<typename T, unsigned int _size>
void log_seq_pbr(const T (&x)[_size]){

    for(unsigned int i = 0; i < _size ; i++){
        std::cout << i << " " << x[i] << std::endl;
    }

    return;
}

/* prints sequentially the elements of an array */
template<typename T, unsigned int _size>
void log_seq_pbv(const T x[_size]){

    for(unsigned int i = 0; i < _size ; i++){
        std::cout << i << " " << x[i] << std::endl;
    }

    return;
}


int main(int argc, char const *argv[])
{
    
    int arr[10] = {0};

    log_seq_pbr(arr);
    log_seq_pbv(arr);


    return 0;
}
tmp.cpp: In function 'int main(int, const char**)':        
tmp.cpp:33:20: error: no matching function for call to 'log_seq_pbv(int [10])'
   33 |     log_seq_pbv(arr);
      |                    ^
tmp.cpp:17:6: note: candidate: 'template<class T, unsigned 
int _size> void log_seq_pbv(const T*)'
   17 | void log_seq_pbv(const T x[_size]){
      |      ^~~~~~~~~~~
tmp.cpp:17:6: note:   template argument deduction/substitution failed:
tmp.cpp:33:20: note:   couldn't deduce template parameter '_size'
   33 |     log_seq_pbv(arr);