将指针作为模板参数传递

时间:2014-03-08 12:09:49

标签: c++ arrays const

我遇到了一个奇怪的问题。在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而不是主要?提前谢谢。

3 个答案:

答案 0 :(得分:1)

模板参数必须是常量表达式。作为具有外部链接的变量的对象的地址是常量表达式;函数本地对象的地址不是。

答案 1 :(得分:0)

问题是语言的定义要求用作模板参数的数组(对象)是静态的。静态对象具有在编译时知道的名称。此名称嵌入到模板实例化的名称中。这就是C ++中模板的工作方式。

模板的每个实例都有自己的机器代码,用于所有函数,类,枚举等。这些类,函数等在每个实例中都有自己的名称。这些名称基于参数。参数可以是值,也可以是指向静态const对象的引用/指针或模板。在所有三种情况下,它应具有全球范围。语言的定义需要这个。

您可能会争辩说,通过额外的努力,编译器可以理解您的要求。好吧,它可以,但语言规范也没有要求编译器编写者做这项工作。

答案 2 :(得分:0)

模板参数必须在编译时知道。在编译时不知道someArray