我知道这constexpr
将使您能够在编译时将对象用作常量,但是什么时候会有益呢?我试图更好地理解该关键字,但找不到在解释为什么需要该关键字的构造方法上使用该关键字时的最佳示例。
下面的两个示例都起作用,那么为什么将constexpr放在构造函数上呢?
在构造函数上使用constexpr:
#include <iostream>
using namespace std;
class Rect
{
public:
constexpr Rect(int width, int height)
: mWidth(width), mHeight(height) {}
constexpr int getArea() const { return mWidth * mHeight; }
private:
int mWidth, mHeight;
};
int main(int argc, char* argv[])
{
constexpr Rect r(8, 2);
cout << r.getArea() << endl; //16
int myArray[r.getArea()]; // OK
return 0;
}
在构造函数上不使用constexpr:
#include <iostream>
using namespace std;
class Rect
{
public:
Rect(int width, int height)
: mWidth(width), mHeight(height) {}
constexpr int getArea() const { return mWidth * mHeight; }
private:
int mWidth, mHeight;
};
int main(int argc, char* argv[])
{
Rect r(8, 2);
cout << r.getArea() << endl; //16
int myArray[r.getArea()]; // OK
return 0;
}
在第二个示例中,int myArray[r.getArea()];
由于r.getArea()
不是常数表达式,因此在Standard C ++中是不允许的。(如果您的编译器接受它,那么您就依赖于编译器扩展,并且如果您以一致模式调用编译器,则应该产生警告)。
如果将数组更改为:
std::array<int, r.getArea()> myArray;
对于非constexpr
版本,编译器不太可能接受。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句