C++中std::array函数模板的std::size_t参数自动推导问题
关于std::array的模板参数自动推导问题
是的,C++模板不仅能推导类型模板参数(比如这里的T),也能推导非类型模板参数(比如std::size_t size),所以你调用printArray(myArray1)是完全合法的,不需要手动指定<double, 5>。
原因很简单:std::array本身就是一个模板类,它的完整类型包含了两个关键信息——元素类型和数组大小,比如你的myArray1实际类型是std::array<double, 5>。当你把这个对象传给printArray函数时,编译器会自动从传入的std::array对象中提取出它的两个模板参数:T=double和size=5,并把这两个参数填充到printArray的模板参数列表里。
你注释里写的printArray<double,5>(myArray1)是显式指定模板参数的写法,这确实能运行,但属于多余操作——编译器已经可以自己完成推导工作。
补充一点:你定义myArray1时用了C++17引入的类模板实参推导(CTAD),编译器从初始化列表的元素(都是double类型,共5个)推导出这是std::array<double,5>类型;而传递给printArray时,又是一次模板参数推导,只不过这次是从完整的std::array类型里拆出模板参数。
内容的提问来源于stack exchange,提问作者someone8718374
相关产品推荐
相关产品推荐

