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模板?
答案(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 在编译时执行。
| 归档时间: |
|
| 查看次数: |
7798 次 |
| 最近记录: |