2016-04-07 2 views
3

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のなし::コンストラクタのconstexprので

r.getArea()が一定でないため、2番目の例では

#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

私のために2番目のものはコンパイルされません:http://coliru.stacked-crooked.com/a/a84bbdd8fb82bb49 – Brian

+0

しかし、constexprは 'getArea()'の両方の例に置かれています。 –

+1

'constexpr'とマークされた関数は、その引数(暗黙の' * this'も含む)が定数式である場合にのみ定数式を返します。 –

答えて

6

int myArray[r.getArea()];は、標準C++で許可されていません表現。コンパイラがそれを受け入れるならば、あなたはコンパイラ拡張に頼っています、そして、準拠モードでコンパイラを呼び出すなら、警告を生成しなければなりません。コンパイラは非constexprバージョンで受け付けすることがほとんどありません

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

:あなたがに配列を変更した場合

違いはより明白であるかもしれません。

+0

私の質問にお答えしますが、基本的に言っているのは、コンパイル時にリテラルとして使用する必要があるオブジェクトを生成するコンストラクタで 'constexpr'だけを使用するということです。 –

+0

@EavenSheetsあなたは「以下の両方の例がうまくいくので、なぜconstexprがコンストラクタに配置されるのですか? 。あなたの2番目の例が実際にはうまくいかないことを示すことによってこれに対処し、 'constexpr'をコンストラクタに置くことで動作させました。 "なぜコンストラクタにconstexprを使用しますか?" 「そのクラスのオブジェクトを定数式を生成するために使用できるようにしたい場合」と答えます。 –

+0

これは質問に答えません。 –

関連する問題