2017-02-17 15 views
2

Mike Isaacsonの「Exploring C++ 17 and beyond」プレゼンテーション(https://youtu.be/-ctgSbEfRxU?t=2907)では、書き込みに関する質問があります:C++ 11とC++ 14のconstexpr

const constexpr .... 

vs単一のconst。 MikeはC++ 11ではconstexprはconstを意味し、C++ではそうではありません14。 それは本当ですか? 私はそれを証明しようとしましたが、できませんでした。

私はconstとconstexpr(他の多くの質問として)の違いについては求めていませんが、C++標準の2つのバージョンのconstexprの違いについては質問しません。

+4

C++ 11では、メンバー関数のconstexprはそのメンバ関数のconstnessを意味します。この意味合いはC++ 14では削除されています。 – dyp

+0

@dyp:私は従いません。定数メンバ関数は、この質問( 'const constexpr')のように、引数リストの前に' const'キーワードを置くことになります。私は何が欠けていますか? – IInspectable

+0

ここでの答え[constexprとconstの違い?](http://stackoverflow.com/questions/14116003/difference-between-constexpr-and-const)この例は 'constexpr const int * NP =&N;'です。宣言のさまざまな部分に影響するため、両方が必要です。それは言語バージョン間で変更されていません。 –

答えて

0

は、コードのこの部分を考慮してください

struct T { 
    int x; 

    constexpr void set(int y) { 
    x = y; 
    } 
}; 

constexpr T t = { 42 }; 

int main() { 
    t.set(0); 
    return 0; 
} 

これはC++ 14にコンパイルするが、メンバ関数setconst宣言されたかのようにC++ 11にエラーを与えるべきです。これは、constexprがC++ 11にconstを含意しているためです。これは、以降のバージョンの標準ではこれ以上真ではありません。

constexprキーワードは、実行時にオブジェクトが動的に初期化されないことを保証します。関数の場合、コンパイル時に関数を評価できることが保証されます。 C++ 11では、これは「読み込み専用メモリに格納されていました」と混乱しましたが、すぐにエラーとして認識されました。

さらに、C++ 14では、constexprの関数とメンバがはるかに優れています。たとえば、非constオブジェクトを変更することができるので、暗黙的にconstにすることはできません。

+1

なぜdownvoteですか? – gigabytes

関連する問題