C++:当与 std::cout 一起使用时,constexpr 函数在编译时不会计算

c++: constexpr function doesn't evaluate at compile time when using with std::cout

本文关键字:函数 编译 计算 constexpr cout std 一起 C++ 当与      更新时间:2023-10-16

我是 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;
}

不会命中断点,这意味着在编译时计算了该函数。我有点困惑为什么在第一种情况下不计算函数?

附言我正在使用Visual Studio 2017。

正如我意识到 constexpr 函数在编译时被计算时

没有。可以在编译时计算它们,但不能保证它们这样做,除非在需要常量表达式的上下文中调用它们。

其中一个上下文是constexpr变量的声明。

constexpr的意思是"可以在编译时计算"而不是"必须在编译时计算"。如果你想看到它在编译时被评估,你可以在需要在编译时计算的上下文中调用它,例如模板参数:

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

请注意,constexpr的动机与许多人预期的相反。 constexpr告诉编译器您可以将其用作模板参数,例如sum模板参数,如果不constexpr则会收到编译器错误。这不是为了确保在编译时始终计算函数。