有这段代码:
#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 double
和const double
变量之间有什么区别?
答案 0 :(得分:2)
const
给出变量内部链接,而extern
和非常量都没有。标准明确禁止内部链接符号作为模板参数(在C ++ 11之前,我知道那里发生了一些变化)。
答案 1 :(得分:1)
当您输入表达式时:
const double dddd = 5.0;
实际上你将dddd别名为5.0并且根本没有变量,它可以用作常量,因此没有地址。您可以将它传递给一个带有const引用的函数,因为参数本身是一个变量,即它在堆栈上有一个空格,您可以获取其地址。你不能用常数做到这一点。您的代码中没有&amp; dddd。
如果你把它变成extern,它实际上会变成占用内存并有地址的“正确”变量。它是不可改变的,但它不是常数。
(基本上,允许编译器消除dddd并将其替换为代码中的任何位置。这是internal linkage
)。