什么是标记集合函数(setter方法)为constexpr的目的是什么? [重复]

问题描述 投票:11回答:3

这个问题已经在这里有一个答案:

我无法理解标记setter函数作为constexpr的目的,也就是因为C ++ 14允许的。我的误解来自于未来的情况:我声明一个类有constexpr C-TOR,我要利用它在constexpr背景下,通过创建类constexpr Point p1的constexpr实例。一个对象p1现在是常量,其值不能改变,所以constexpr制定者不能被调用。在另一方面,当我创造我在非constexpr背景class Point Point p的实例,我可以调用的setter该对象,但现在制定者不会在编译时执行,因为对象不constexpr!

其结果是,我不明白我怎么能提高我的代码使用constexpr的制定者的表现。

这是一个演示调用一个非constexpr对象的constexpr制定者的代码,这意味着而非编译时运行时间计算,:

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);
}

谁能帮我明白了什么是标志着二传手功能constexpr的目的是什么?

c++ c++14 constexpr
3个回答
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();

我们的想法是能够将在编译时执行的另一个函数中执行编译时初始化。它不这样做constexpr对象上得到应用。

要知道另一个事情是,constexpr成员函数不是因为C ++ 14 :) const成员函数。


6
投票

在有需要时用C ++ 14新constexpr规则:constexpr函数里面,你现在可以使用多条语句,包括循环和控制流。

下面是一个例子:

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!

正如你所看到的,我们可以做很多突变变量在constexpr上下文。编译器变得像一个解释器,只要constexpr fonction的结果是一致的,你不发生变异已经计算constexpr变量,它可以解释变异过程中的值。


-1
投票

constexpr预选赛功能将评估在编译时的功能,它可以显著提高程序的性能回报(没有额外的计算,没有指令反跳等)。有资格正是如此的功能,因此,请检查从IBM这个解释的几个要求。

© www.soinside.com 2019 - 2024. All rights reserved.