首页 > 解决方案 > 将 set 函数(setter)标记为 constexpr 的目的是什么?

问题描述

我无法理解将 setter 函数标记为 的目的constexpr,这是自 C++14 以来允许的。我的误解来自下一种情况:我声明了一个带有 constexpr c-tor 的类,并且我将通过创建该类的 constexpr 实例在 constexpr 上下文中使用它constexpr Point p1。一个对象p1现在是常量,它的值不能改变,所以constexpr不能调用 setter。另一方面,当我class Point在非 constexpr 上下文中创建 my 的实例时Point p,我可以调用该对象的 setter,但现在 setter 不会在编译时执行,因为该对象不是 constexpr!

结果,我不明白如何使用constexprsetter 来提高代码的性能。

这是演示在非 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什么?

标签: c++c++14constexpr

解决方案


基本上,当您必须处理 constexpr 函数时,这很好。

struct Object {
  constexpr void set(int n);
  int m_n = 0;
};

constexpr Object function() {
   Object a;
   a.set(5);
   return a;
}

constexpr Object a = function();

这个想法是能够在编译时执行的另一个函数中执行编译时初始化。它不适合应用于constexpr对象。

另一件要知道的事情是,constexpr成员函数不是constC++14 以来的成员函数 :)。


推荐阅读