Ich verstehe, dass constexpr
Ihnen erlauben würde, ein Objekt als eine Konstante zum Zeitpunkt der Kompilierung zu verwenden, aber was ist ein Beispiel dafür, wann dies von Vorteil wäre? Ich versuche, das Schlüsselwort besser zu verstehen, aber ich kann kein gutes Beispiel finden, das übergeht, wenn ich es für einen Konstruktor verwende, der erklärt, warum es benötigt wird.Warum würden Sie einen Contexpr auf einem Konstruktor verwenden?
Die beiden folgenden Beispiele funktionieren, also warum wird der consExpr auf den Konstruktor gelegt?
Mit constexpr auf Konstruktor:
#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;
}
Ohne constexpr auf Konstruktor:
#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;
}
Zweite kompiliert nicht für mich: http://coliru.stacked-crooked.com/a/a84bbdd8fb82bb49 – Brian
Aber consExpr ist in beiden Beispielen für 'getArea()' platziert. –
Eine mit 'constexpr' gekennzeichnete Funktion gibt nur dann einen konstanten Ausdruck zurück, wenn ihre Argumente (einschließlich implizierter '* this') ebenfalls konstante Ausdrücke sind. –