模板指针参数包
template pointer parameter pack
为什么不能使用相同指针的偏移来实例化使用模板参数包的模板函数?
我的意思是:鉴于此简短代码,为什么我必须评论最后两行?
template <int * ... pt> void f() {}
int n[] = {1, 2, 3};
int m = n[1];
int main()
{
f<n>(); // this is accepted
f<n, &m>(); // this is accepted too
//f<n, n+1>(); // this is not.
//f<n, &n[1]>(); // this isn't accepted neither
}
n+1
不代表与&m
相同的地址?还是链接有区别?还是还有什么?
请参阅cppreference.com-模板非类型参数
- 对于对象的指针,模板参数必须指定具有静态存储持续时间和链接(内部或外部(的对象的地址,或评估适当的null指针或STD :: NULLPTR_T值的常数表达式。
...
唯一的例外是参考和指针类型的非类型模板参数不能参考/是
的地址
- 一个子对象(包括非静态类成员,基本子对象或数组元素(;
- 一个临时对象(包括在参考初始化过程中创建的对象(;
因此不允许数组元素的地址。
在C 17中,来自[temp.arg.nontype]:
对于参考或指针类型的非类型模板参数,常数表达式的值不得指(或指针类型,不应是(:
的地址(
- 一个子对象,
- [...]
supObject是[Into.Object]:
对象可以包含其他称为子对象的对象。一个子对象可以是成员subobject([class.mem](,基类subobject([class.derdived](或数组元素。
使用&m
作为非类型模板参数很好 - 它指向对象。该对象恰好是从n[1]
初始化的,但这没关系。
另一方面,n+1
和&n[1]
都指向数组n
的元素,也就是说,它们都指向n
的子对象,因此不允许使用。n+1
和&m
无关。
在C 11和C 14中,措辞是包含性而不是独家,但结论是相同的:
a template-argument 对于非类型,非模板模板参数应为:
- [...]
- 一个常数表达式([expr.const](指定完整对象的地址带有静态存储持续时间,外部或内部链接或具有外部或内部链接的功能,包括功能模板和功能模板-ID,但不包括非静态类成员,以[...]
表示(忽略括号(- [...]
允许使用m
的指针,n[1]
的指针不。
相关文章:
- 使用指向成员的指针将成员函数作为参数传递
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 修改函数中的指针(将另一个指针作为参数传递)
- Clang bug?使用指针作为模板参数
- MSVC将仅移动结构参数解释为指针
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 如何使用非类型模板参数传入指向数组的指针
- 将成员函数指针作为参数传递给模板方法
- 匹配函数指针作为模板参数?
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 通过智能指针和转换对基本模板参数进行模板推导
- 为函数定义符号不明确的指针参数
- 使用引用与指针将数组作为参数传递
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 将函数参数完美转发到函数指针:按值传递呢?
- 保留函数指针模板参数
- 如何构造一个以可变参数指针函数作为成员的类?
- 指向对象的非类型模板参数指针
- c++ 使用 *& as 参数(指针乐趣,三级树方法)