最近,我了解了非类型参考参数,例如template<auto& t>
。
然后我发现t
可以在运行时修改:
#include <iostream>
template<auto& N>
struct X{
int operator()() { return N; }
};
int a = 2;
int main()
{
std::cin >> a; //stdin: 5
auto temp = X<a>();
std::cout << temp() << '\n';
}
输出为5
,而不是2
。是否意味着temp
在运行时被实例化?
我会尽力回答我自己的问题。如果有任何错误,请纠正我,谢谢!其他答案也欢迎!
答案 0 :(得分:0)
输出5
的原因是引用类型auto
&amp;这只是意味着
N
将在实例化时与a
绑定并compile-time
。 看看这个:
#include <iostream>
template<auto& N>
struct X{
int operator()() { return N; }
};
int a;
int main()
{
auto temp = X<a>();
std::cout << "Compile-time: " << temp() << '\n'; //output 0
std::cin >> a; //stdin: 5
std::cout << "Run-time: " << temp() << '\n'; //output 5
}
感谢Guillaume Racicot的评论,以下是错误的。
a在编译时时使用0
进行初始化,并在运行时进行修改。 N
中的temp
已从0
(编译时)更改为5
(运行时)。 德尔>
更新:
在许多实现中,a
存储在bss
段中,并且在运行时由crt0
初始化为零或源代码中没有显式初始化。