我是c ++的新手,目前遇到constexpr
。我意识到constexpr
函数是在编译时评估的。这是我的源代码:
constexpr int sum(float a, int b)
{
return a + b;
};
int main(int argc, char *argv[])
{
std::cout << sum(1, 2) << std::endl;
}
这是一个简单的函数,仅求和为整数。问题是,当我在return a + b
处设置断点并开始调试时,会遇到断点,这意味着该函数在编译时未评估。但是当我将主要功能更改为此:
int main(int argc, char *argv[])
{
constexpr int var = sum(2, 2);
std::cout << var << std::endl;
}
断点未命中,这意味着函数是在编译时评估的。我有点困惑,为什么在第一种情况下不对函数求值?
PS 我正在使用Visual Studio 2017。
答案 0 :(得分:13)
我意识到constexpr函数是在编译时评估的
不是。可以在编译时对它们进行评估,但不能保证这样做,除非在需要恒定表达式的上下文中调用它们。
一个这样的上下文是constexpr
变量的声明。
答案 1 :(得分:7)
constexpr
的意思是“可以在编译时评估”,而不是“必须在编译时评估”。如果要在编译时评估它,可以在需要在编译时评估的上下文中调用它,例如模板参数:
std::array<int, sum(3,5)> x;
请注意,constexpr
的动机与许多人所期望的相反。 constexpr
告诉编译器您可以使用它,例如作为模板参数,如果sum
不是constexpr
,则会出现编译器错误。并不是要确保始终在编译时对函数进行求值。