模板; constexpr;编译时间

时间:2017-06-24 15:39:39

标签: c++ c++11 templates constexpr

我有几个问题

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与模板一起使用?

1 个答案:

答案 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执行编译时。

相关问题