繁体   English   中英

如何在数组类型的模板代码中计算std :: size_t

[英]How std::size_t is calculated in the template code for array type

我正在阅读《 C ++模板 》一书-完整指南,第二版,并从中获得了如下代码:

template<typename T>
void showVal(const T &arg1, const T &arg2)
{
    std::cout << arg1 << arg2;
}

int main() {
    showVal("hello", "world1");
    return 0;
}

上面的代码给了我这个错误:- “错误C2782:'void showVal(const T&,const T&)':模板参数'T'不明确” 这是合理的,因为我传递的参数被推导为const char [6]和const char [7]。 为了解决这个问题,我对函数进行了如下更改:-

template<typename T, std::size_t L1, std::size_t L2>
void showVal(const T (&arg1)[L1], const T(& arg2)[L2])
{
    std::cout << arg1 << arg2;
}

PS:-我从书中获得了此修复程序

主要的困惑在于L1和L2的值。 编译器如何知道它必须将6和7传递给模板参数L1和L2。 数组类型有任何规则吗?

如您首次尝试的错误消息所示, "hello"的类型为const char[6] 数组的长度为6。如您所见,数组的长度是数组类型的一部分。 由于编译器必须知道类型,因此它隐式也知道长度。

就像根据传递给非模板参数arg1arg2的表达式的类型(这些类型为const char[6]const char[7] )将模板类型参数T推导出为const char ,模板非类型参数L1L2是从那些相同的参数类型推导出来的。

功能模板

template<typename T, std::size_t L1, std::size_t L2>
void showVal(const T (&arg1)[L1], const T(& arg2)[L2])

调用showVal(“ hello”,“ world1”)编译器将进行隐式实例化

showVal(const char (&arg1)[6], const T(& arg2)[7])

这样便可以防止数组衰减到指针,将引用绑定到数组类型,从而实现函数定义已知参数的数组大小。 因此,对于调用showVal(“ hello”,“ world1”),编译器推断出T为char,而参数类型分别为char大小为6和7的数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM