繁体   English   中英

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

[英]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 doubleconst 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM