为什么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();
如果无法进行编译时评估,这确实会给您一个错误。