2016-04-07 1 views
3

Я понимаю, что 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; 
} 
+1

Второй не компилируется для меня: http://coliru.stacked-crooked.com/a/a84bbdd8fb82bb49 – Brian

+0

Но constexpr помещается в оба примера для 'getArea()'. –

+1

Функция, отмеченная 'constexpr', возвращает только константное выражение, если его аргументы (включая подразумеваемые' * this') также являются постоянными выражениями –

ответ

6

В вашем втором примере int myArray[r.getArea()]; не допускается в стандарте C++, потому что r.getArea() не является постоянной выражение. (Если ваш компилятор принимает его, то вы полагаетесь на расширение компилятора и должны выдать предупреждение, если вы вызываете компилятор в соответствующем режиме).

Разница может быть более очевидной, если изменить массив:

std::array<int, r.getArea()> myArray; 

, который он вряд ли компилятор принять ресовавшиеся constexpr версии.

+0

Ну, это действительно не обратитесь к моему вопросу, но в основном вы говорите, что вы будете использовать 'constexpr' только в конструкторе, который будет создавать объект, который потребуется для использования в качестве литерала во время компиляции? –

+0

@EavenSheets Вы спросили: «Оба приведенных ниже примера работают, так почему же constexpr помещается в конструктор?» , Я обратился к этому, показывая, что ваш второй пример фактически не работает, и размещение 'constexpr' в конструкторе заставляет его работать. «Зачем вы используете constexpr для конструктора?» ответил «Если вы хотите, чтобы объекты этого класса могли использоваться для генерации постоянного выражения». –

+0

Это не отвечает на вопрос. –