【发布时间】:2014-07-18 13:26:27
【问题描述】:
当推导非类型模板参数时,比如n,n 的类型必须在参数和实参之间完全匹配。所以下面的代码不会编译(至少在 GCC 和 clang 上):
#include <array>
template <int n> void f(std::array<int, n> const&) {}
int main() {
std::array<int, 3> arr;
f(arr);
}
这是因为std::array 被声明为
template <typename T, std::size_t n> class array;
而不是
template <typename T, int n> class array;
但是,要捕获内置数组的大小,似乎任何整数类型都可以。以下所有工作都适用于 GCC、clang 和 VC++:
template <typename T, char n > void f(T (&)[n]);
template <typename T, short n> void f(T (&)[n]);
template <typename T, int n> void f(T (&)[n]);
...
所以说真的,内置数组大小的类型是重载的?
【问题讨论】:
-
错误信息是什么?
-
隐式积分转换并不是什么新鲜事...
-
@Lightness Races in Orbit:虽然这对于非类型模板参数的类型来说是新事物。