2012-02-09 92 views
0

有这样的代码:常变量不能作为参考模板参数,但非const可以

#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变量有什么区别?

+0

我认为这是重复的,我们在不久前。要点是,'const'全局改变了与内部或某事的联系,并且模板参数在C++ 11之前需要外部链接。 – Xeo 2012-02-09 22:08:25

+0

so'double dddd = 5.0;'有外部联系呢? – scdmb 2012-02-09 22:10:58

+0

看到马克B的回答,是的。 – Xeo 2012-02-09 22:12:41

回答

2

const默认给变量内部链接,而extern和non-const都没有。内部链接符号被明确禁止作为标准模板参数(pre-C++ 11,我知道在那里改变了一些东西)。

1

当你把在表达式:

const double dddd = 5.0; 

有效你混叠DDDD为5.0并且不存在变量有可言,它可以被用来作为一个常数,因此没有地址。您可以将它传递给一个接受const引用的函数,因为参数本身是一个变量,即它在堆栈中有一个空间,您可以获取它的地址。你不能用常量来做到这一点。代码中没有& dddd。

如果你将它设置为extern,它实际上会变成占用内存并具有地址的“适当”变量。它是不变的,但它不是一个常数。

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