c ++:与std :: cout一起使用时,constexpr函数在编译时不求值

时间:2019-04-26 11:23:29

标签: c++ c++14

我是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。

2 个答案:

答案 0 :(得分:13)

  

我意识到constexpr函数是在编译时评估的

不是。可以在编译时对它们进行评估,但不能保证这样做,除非在需要恒定表达式的上下文中调用它们。

一个这样的上下文是constexpr变量的声明。

答案 1 :(得分:7)

constexpr的意思是“可以在编译时评估”,而不是“必须在编译时评估”。如果要在编译时评估它,可以在需要在编译时评估的上下文中调用它,例如模板参数:

std::array<int, sum(3,5)> x;

请注意,constexpr的动机与许多人所期望的相反。 constexpr告诉编译器您可以使用它,例如作为模板参数,如果sum不是constexpr,则会出现编译器错误。并不是要确保始终在编译时对函数进行求值。