MST
星途 面试题库

面试题:C++函数模板非类型参数的基本作用域规则

请简述C++函数模板中,非类型参数的作用域范围,并举一个简单的函数模板示例,说明非类型参数在函数模板内部如何使用,以及其作用域在该示例中的体现。
18.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 非类型参数的作用域范围
    • C++函数模板中的非类型参数的作用域是整个模板定义。它在模板声明和定义的范围内有效,类似于函数参数在函数体中的作用域,只不过这里是针对模板。在模板实例化时,非类型参数的值是固定的,不能在模板函数内部被修改。
  2. 函数模板示例
#include <iostream>

// 函数模板定义,非类型参数N表示数组的大小
template <typename T, int N>
T sumArray(T arr[N]) {
    T result = T();
    for (int i = 0; i < N; ++i) {
        result += arr[i];
    }
    return result;
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    // 实例化模板,这里N被实例化为5
    int sum = sumArray<int, 5>(arr);
    std::cout << "Sum of array elements: " << sum << std::endl;
    return 0;
}

在这个示例中:

  • 非类型参数NsumArray函数模板定义中,它确定了数组arr的大小。
  • 其作用域体现在sumArray函数模板的整个定义中,从模板声明template <typename T, int N>开始,到函数模板定义结束。在sumArray函数内部,N用于控制循环的次数,以遍历整个数组。在main函数中实例化sumArray<int, 5>时,N被固定为5,并且在sumArray函数模板实例化后的代码中,N的值不能被修改,这体现了它在模板实例化后的固定性和其作用域范围。