将set函数(setter)标记为constexpr的目的是什么?

mar*_*eva 11 c++ constexpr c++14

我无法理解将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);
}
Run Code Online (Sandbox Code Playgroud)

谁能帮我理解将setter函数标记为什么目的constexpr

Ant*_*ier 15

基本上,当你必须处理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();

Run Code Online (Sandbox Code Playgroud)

我们的想法是能够在将在编译时执行的另一个函数中执行编译时初始化.它没有被应用于constexpr对象.

另一件需要知道的事情是,自C++ 14以来,constexpr成员函数不是const成员函数.


Gui*_*cot 6

需要使用带有C++ 14的新constexpr规则:在constexpr函数内部,您现在可以使用多个语句,包括for循环和控制流.

这是一个例子:

constexpr int count5(int start) {
    int acc = 0;

    for (int i = start ; i<start+5 ; ++i) {
        acc += i;
    }

    return acc;
}

constexpr int value = count5(10); // value is 60!
Run Code Online (Sandbox Code Playgroud)

如您所见,我们可以在constexpr上下文中对变量进行许多变异.编译器就像一个解释器,只要constexpr函数的结果是一致的并且你没有改变已经计算过的constexpr变量,它就可能在解释过程中改变这些值.