Я понимаю, что constexpr
позволит вам использовать объект как константу во время компиляции, но что является примером того, когда это было бы полезно? Я пытаюсь понять ключевое слово лучше, но я не могу найти хороший пример, который возникает при использовании его в конструкторе, который объясняет, почему это необходимо.Зачем вам использовать 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;
}
Второй не компилируется для меня: http://coliru.stacked-crooked.com/a/a84bbdd8fb82bb49 – Brian
Но constexpr помещается в оба примера для 'getArea()'. –
Функция, отмеченная 'constexpr', возвращает только константное выражение, если его аргументы (включая подразумеваемые' * this') также являются постоянными выражениями –