c++ - 为什么 constexpr 方法可以正确返回在执行过程中值发生变化的类成员?
问题描述
我刚刚发现一个constexpr
方法可以正确返回在执行过程中发生变化的类成员的值。我的问题是,如果constexpr
方法应该在编译时完全评估,这怎么可能?
下面的示例正确输出Value: 0
然后Value: 5
. 更重要的是,如果我将其更改a.change(5)
为编译器无法预测的内容(例如,a.change(atoi(argv[1]))
它a.change(rand() % 10 + 1)
仍然可以工作。为什么?为什么它甚至可以编译?
#include <iostream>
class A
{
public:
void change(int value) { x = value; }
int get() const { return x; }
constexpr int value() const noexcept { return x; }
private:
int x{0};
};
int main()
{
A a;
std::cout << "Value: " << a.get() << std::endl;
a.change(5);
std::cout << "Value: " << a.get() << std::endl;
}
先感谢您
解决方案
在您的示例中,您甚至没有调用该constexpr
函数,而是在调用get
,而不是constexpr
。
但是,constexpr
函数可以在编译时进行评估,如果编译时评估是不可能的,也可以在运行时进行评估。
如果您调用value
而不是get
,它仍然可以工作,并且该函数将在运行时进行评估。
为了强制编译时评估,您可以编写
constexpr auto val = a.value();
如果无法进行编译时评估,这确实会给您一个错误。
推荐阅读
- c# - 您必须先加载或分配此属性,然后才能读取它
- puppet - Puppet:我尝试在 mainifest 中获取内存事实并得到错误 Operator '[]' is not applicable to an Undef Value
- python - 无法从“sklearn.preprocessing”导入名称“StandardScalar”
- python - Python条带函数
- openstreetmap - 为什么将 OSM 数据下载到 Postgis / Postgresql 时缺少标签键?
- python - glReadPixels 显示 PyQt5 错误。使用 GLUT Window 它工作正常
- python - 我需要获取数据帧最密集点的坐标(x,y)
- android - 选项菜单选项不指向另一个活动
- sql - 如何估计 DolphinDB 中的最小二乘参数
- json - Dart - 类“TimeOfDay”没有实例方法“toJson”