gpt4 book ai didi

c++ - 模板;构造函数;编译时间

转载 作者:搜寻专家 更新时间:2023-10-31 02:10:47 25 4
gpt4 key购买 nike

我有几个问题

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):两个版本。

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

constexpr double myfunc(int x)

现在如果你这样调用它

constexpr double d1 = myfunc(1);
double d2 = myfunc(1);

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

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

关于c++ - 模板;构造函数;编译时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44738099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com