我遇到了一个奇怪的问题。在C ++ 03和C ++ 11中,以下代码都可以:
int someArray[] = {1,2,3,4};
template<int* ptr>
void function() {
}
int main(int argc, char* argv[]) {
function<someArray>();
return 0;
}
但是如果你把someArray
放在main中,它就不再适用于C ++ 03和C ++ 11。为什么是这样?另外,为什么someArray
需要{main} constexpr
而不是主要?提前谢谢。
答案 0 :(得分:1)
模板参数必须是常量表达式。作为具有外部链接的变量的对象的地址是常量表达式;函数本地对象的地址不是。
答案 1 :(得分:0)
问题是语言的定义要求用作模板参数的数组(对象)是静态的。静态对象具有在编译时知道的名称。此名称嵌入到模板实例化的名称中。这就是C ++中模板的工作方式。
模板的每个实例都有自己的机器代码,用于所有函数,类,枚举等。这些类,函数等在每个实例中都有自己的名称。这些名称基于参数。参数可以是值,也可以是指向静态const对象的引用/指针或模板。在所有三种情况下,它应具有全球范围。语言的定义需要这个。
您可能会争辩说,通过额外的努力,编译器可以理解您的要求。好吧,它可以,但语言规范也没有要求编译器编写者做这项工作。
答案 2 :(得分:0)
模板参数必须在编译时知道。在编译时不知道someArray
。