为什么模板非类型形参指针和引用实参需要是全局的
Why template nontype parameter pointer and reference arguments needs to be global
为什么作为非类型参数传递的参数应该是全局的而不是局部的?不是在编译期间创建和分配内存吗?
在这种情况下,p是一个const指针,所以它不能指向任何其他变量,也不能给出错误,为什么?
template<int* ptr>
class A{};
int x;
int *const p = &x;
int main() {
x = 9;
A<&x> ob;
A<p> ob2;//giving error
cin.get();
}
为什么只允许整型作为非类型参数,而不允许char或float?
关于第一个问题,我不是编译器专家,但我可以猜测它使编译器的生活更容易,也许这是来自旧版本的c++的限制,其中constexpr
不可用。
然而,c++ 11标准的第14.3.2/1段非常清楚地说明了什么是允许的,什么是不允许的:
非类型、非模板模板形参的模板实参必须是:
—对于整型或枚举型的非类型模板形参,转换后的常量表达式(5.19)模板参数的类型;或者
—非类型模板参数的名称;或者
—一个常量表达式(5.19),用于指定具有静态存储持续时间和的对象的地址外部或内部链接或具有外部或内部链接的函数,包括函数模板和函数模板id,但不包括非静态类成员,表示为(忽略括号),id-expression,除了&如果名称指的是函数或数组,则可以省略如果对应的模板参数是引用,则省略;或者
—计算结果为空指针值的常量表达式(4.10);或者
—计算结果为空成员指针值的常量表达式(4.11);或者
—5.3.1中描述的指向成员的指针;或者
- std::nullptr_t类型的地址常量表达式。
关于你的第二个问题,相反,char
是允许的。例如,下面是一个合法的程序:
template<char c>
struct X
{
// ...
};
int main()
{
X<'c'> x;
}
关于不允许浮点类型的原因,您可以在StackOverflow的问答中找到一些信息。
相关文章:
- 非类型引用形参/实参
- 成员函数指针的模板实参演绎
- 函数和函数作为模板函数的实参
- Const到非Const指针模板实参的转换
- 传递boost::函数,该函数接受一个模板实参作为默认为NULL的形参
- 当实参是初始化列表而形参是引用时,重载解析
- 函数模板中返回类型的模板实参演绎
- ostream_iterator的模板实参-每个元素都是pair
- c++——关于使用默认实参的困惑
- std::shared_ptr、继承和模板实参演绎的问题
- 将操作符转换为模板实参的特化
- 使用模板模板形参时,模板实参推导失败
- 带有const实参的c++构造函数
- 函数指针作为模板实参而不是函子
- c++临时对象绑定到实参并返回const引用值
- 调用对象作为默认实参的this
- 当涉及一个重载函数作为实参时,模板实参推导是如何工作的
- c++对const引用的实参依赖没有改变
- 为什么模板非类型形参指针和引用实参需要是全局的
- 将函数形参的实参解包到c++模板类