【发布时间】:2016-02-17 04:26:45
【问题描述】:
我们知道arrays decay to pointers in function templates 并且要采用数组类型参数,我们需要使用数组引用来声明我们的函数模板:
template<class T, std::size_t N>
std::size_t number_of_elements(T (&ary)[N]) {
return N;
}
但是,为什么我们不需要在类模板中声明数组引用参数呢?下面的代码显示了这一点,并在 C++11 下编译。
template<class T>
struct cls_number_of_elements {};
template<class T, std::size_t R>
struct cls_number_of_elements<T[R]> {
static const int N = R;
};
char ary[] = "12345";
auto const N = cls_number_of_elements<decltype(ary)>::N;
char ar2[N];
【问题讨论】:
-
我想这可能是因为
decltype(ary)使它成为一个数组类型,而模板推导将它衰减为一个指针。 -
感谢@JamesRoot。尤其令人困惑的是,当函数传递一个数组类型的参数时,
template<class T> void array_template(T t)和template<class T, std::size_t N> void array_template(T ary[N])都会发生衰减。 -
我不明白你的问题是什么。您的两个代码示例都很好,两者之间没有任何矛盾。您能否展示一段不起作用但您认为它应该起作用的代码?
-
您链接的问题是关于函数模板推导的,而您的第二个代码示例是关于类模板的。一般来说,函数模板和类模板有不同的规则。