常量变量不能作为模板参数供参考,但非常量可以

时间:2012-02-09 22:02:22

标签: c++ templates

有这段代码:

#include <iostream>

template<const double& f>
void fun5(){
    std::cout << f << std::endl;
} 

//const double dddd = 5.0; error: ‘dddd’ cannot appear in a constant-expression
//however it works for extern const double dddd = 5.0;

double dddd = 5.0; // works

int main() 
{ 
    fun5<dddd>();
    return 0;
} 

const double dddd不能用作模板参数(但extern const double dddd有效)。 double dddd有效,但不是一成不变的。全局范围内定义的extern const doubleconst double变量之间有什么区别?

2 个答案:

答案 0 :(得分:2)

默认情况下,

const给出变量内部链接,而extern和非常量都没有。标准明确禁止内部链接符号作为模板参数(在C ++ 11之前,我知道那里发生了一些变化)。

答案 1 :(得分:1)

当您输入表达式时:

const double dddd = 5.0;

实际上你将dddd别名为5.0并且根本没有变量,它可以用作常量,因此没有地址。您可以将它传递给一个带有const引用的函数,因为参数本身是一个变量,即它在堆栈上有一个空格,您可以获取其地址。你不能用常数做到这一点。您的代码中没有&amp; dddd。

如果你把它变成extern,它实际上会变成占用内存并有地址的“正确”变量。它是不可改变的,但它不是常数。

(基本上,允许编译器消除dddd并将其替换为代码中的任何位置。这是internal linkage)。