C++:当与 std::cout 一起使用时,constexpr 函数在编译时不会计算
c++: constexpr function doesn't evaluate at compile time when using with std::cout
我是 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
则会收到编译器错误。这不是为了确保在编译时始终计算函数。
相关文章:
- 跨模板化函数编译的静态变量
- 无法使用 LoadObject() 函数编译 UE4 Actor。
- 为什么在使用转换构造函数编译代码时需要 const 复制构造函数?
- 函数编译,即使它不接受整数
- 使用C 模板函数编译时间递归
- 安卓 JNI - 'raw'函数编译失败
- C++就地析构函数编译警告
- 对 TR1 使用 boost 时提升数学特殊函数编译错误
- 显式复制构造函数编译错误
- 使用SSE内部函数编译一个简单的c++程序
- 函数编译时错误
- 模板函数编译错误
- C++:使用类型名作为基的模板类调用函数编译时错误
- 将 MATLAB 函数编译成可以在 linux 终端上运行的东西,w.out MATLAB
- boost::绑定不要使用成员模板函数编译
- C++函数编译错误
- 加速模板函数编译
- 如何在C++中使用辅助函数编译以下flex文件
- 如何让g++使用move构造函数编译c++11代码
- 同时将一组函数编译为.LIB和.DLL