我有几个问题
1)
#include <iostream>
template<typename T>
void func(T t){}
int main()
{
int i;
double d;
std::cin>>i;
if(i==1)
func(i);
else
func(d);
}
什么时候(运行时/编译时)生成所需的功能?实例化后有多少个版本的函数?
2)
之间有什么区别template<typename T> auto func(T t){return 0;}
和
template<typename T> constexpr auto func(T t){return 0;}
据我所知,template
在编译时工作,constexpr
也工作。为什么(以及何时)我需要将constexpr
与模板一起使用?
答案 0 :(得分:2)
答案(1):两个版本。
答案(2):函数实例化和执行是两个不同的概念。模板函数在编译时实例化,这并不意味着它将执行编译时。 constexpr
在此上下文中是不同的,因为它可以在编译时生成并执行,具体取决于调用它的上下文和参数。想象一下像这样声明的函数
constexpr double myfunc(int x)
现在,如果你这样称呼它
constexpr double d1 = myfunc(1);
double d2 = myfunc(1);
您将在编译时计算d1的值,而d2将在运行时计算。 constexpr
与模板无关,但您可以将它们混合在一起。例如,myfunc可能会被模板化。它会执行编译时间还是运行时间,取决于因素(如上所述)。
constexpr
将确保它们是编译时初始化的(因此默认情况下为const)。这就是为什么在上面的情况下,d1的'context'强制myfunc执行编译时。