非类型引用参数可以在运行时修改,是否意味着模板可以在运行时实例化?

时间:2018-06-07 03:55:22

标签: c++ templates parameters

最近,我了解了非类型参考参数,例如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在运行时被实例化?

我会尽力回答我自己的问题。如果有任何错误,请纠正我,谢谢!其他答案也欢迎!

1 个答案:

答案 0 :(得分:0)

不,All the standard requires is that the observable behavior be as if the templates were instantiated before the program started to run.

输出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
}

live demo

感谢Guillaume Racicot的评论,以下是错误的。

a在编译时时使用0进行初始化,并在运行时进行修改。 N中的temp 已从0编译时)更改为5运行时)。

更新:

在许多实现中,a存储在bss段中,并且在运行时由crt0初始化为零或源代码中没有显式初始化。