模板;常量表达式;编译时间

Eph*_*edo 4 c++ templates constexpr c++11

我有几个问题

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);
}
Run Code Online (Sandbox Code Playgroud)

何时(运行时/编译时)生成所需的函数?实例化后有多少个版本的函数?

2)有什么区别

template<typename T> auto func(T t){return 0;}
Run Code Online (Sandbox Code Playgroud)

template<typename T> constexpr auto func(T t){return 0;}
Run Code Online (Sandbox Code Playgroud)

据我了解,template在编译时constexpr也有效。为什么(以及何时)我需要使用 constexpr模板?

Man*_*hna 6

答案(1):两个版本。

答案(2):函数实例化和执行是两个不同的概念。模板函数在编译时实例化,这并不意味着它会在编译时执行。constexpr在这个上下文中是不同的,根据调用它的上下文和参数,它可以在编译时生成和执行。想象一个这样声明的函数

constexpr double myfunc(int x)
Run Code Online (Sandbox Code Playgroud)

现在如果你这样称呼它

constexpr double d1 = myfunc(1);
double d2 = myfunc(1);
Run Code Online (Sandbox Code Playgroud)

您将在编译时计算 d1 的值,而 d2 将在运行时计算。constexpr与模板无关,但您可以将它们混合在一起。例如这里 myfunc 可以被模板化。它是执行编译时还是运行时,将取决于因素(如上所述)。

constexpr,与对象一起使用,将确保它们在编译时初始化(因此默认为 const )。这就是为什么在上述情况下,d1 的“上下文”强制 myfunc 在编译时执行。