[英]Constant variable cannot be template parameter for reference, but non-const can
有以下代码:
#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
变量有什么区别?
const
默认给变量内部链接,而extern
和non-const都不给。 标准明确禁止内部链接符号作为模板参数(C ++ 11之前的版本,我知道那里有一些更改)。
当您输入表达式时:
const double dddd = 5.0;
实际上,您将dddd别名为5.0,并且根本没有变量,它可以用作常量,因此没有地址。 您可以将其传递给采用const引用的函数,因为参数本身是变量,即它在堆栈上有一个空格,您可以获取其地址。 您不能使用常量来做到这一点。 您的代码中没有&dddd。
如果将其设置为extern,它实际上会变成一个“ proper”变量,该变量占用内存并具有一个地址。 它是不可变的,但不是常数。
(基本上,允许编译器消除dddd并将其替换为代码中任何位置的5.0。这是internal linkage
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.