【发布时间】:2019-02-07 14:20:45
【问题描述】:
我无法理解将 setter 函数标记为 constexpr 的目的,这是从 C++14 开始允许的。
我的误解来自下一个情况:
我声明了一个带有 constexpr c-tor 的类,并且我将通过创建该类constexpr Point p1 的 constexpr 实例在 constexpr 上下文中使用它。对象p1 现在是常量,其值无法更改,因此无法调用constexpr 设置器。
另一方面,当我在非 constexpr 上下文 Point p 中创建 class Point 的实例时,我可以调用该对象的 setter,但现在 setter 不会在编译时执行,因为该对象不是常量表达式!
因此,我不明白如何将 constexpr 用于 setter 来提高代码的性能。
这是演示在非 constexpr 对象上调用 constexpr setter 的代码,这意味着运行时计算,而不是编译时:
class Point {
public:
constexpr Point(int a, int b)
: x(a), y(b) {}
constexpr int getX() const noexcept { return x; }
constexpr int getY() const noexcept { return y; }
constexpr void setX(int newX) noexcept { x = newX; }
constexpr void setY(int newY) noexcept { y = newY; }
private:
int x;
int y;
};
int main() {
Point p{4, 2};
constexpr Point p1{4, 2};
p.setX(2);
}
谁能帮我理解将setter函数标记为constexpr的目的是什么?
【问题讨论】:
-
constexpr 说明符声明可以在编译时计算函数或变量的值。简单明了。就像你写了
Point p2{2, 2}并在后续语句中使用它而不是 p。