constとconstexprの違い


C++11にて導入されたconstexprについて、従来のconst修飾子との違いを教えて下さい。

一般的な利用においては同様に振舞っているように見えますが、constとconstexprで動作に差が出る例も示していただけると幸いです。




この↓訳文でいかがですか？  
<http://www32.ocn.ne.jp/~ons/text/CPP0xFAQ.html.ja#constexpr>

constexpr はコンパイル時定数として評価されるもの、const は実行時に読み取り専用として扱われるもの (なので、const
宣言されていても定数であるとは限らない。そのスコープで書き込みされないというだけ。ついでに言うと、mutable 指定されたメンバに対するアクセスは
const 性の担保の対象外になります)。

また、constexpr として定義されたオブジェクトは const 性を持つと言っても概ね問題ないと思いますが、逆は真ではありません。

他にマニアックな例としては、コンストラクタの戻り値を constexpr と書くことはできますが、const と書くことはできません、とか。

[code]

    class A {
            // こうは書ける。
            constexpr A() { }
    };
    
    class B {
            // こうは書けない (書けたとしても意味はないけれど)。
            const B() { }
    };
    
[/code]




この↓訳文でいかがですか？  
<http://www32.ocn.ne.jp/~ons/text/CPP0xFAQ.html.ja#constexpr>

constexpr はコンパイル時定数として評価されるもの、const は実行時に読み取り専用として扱われるもの (なので、const
宣言されていても定数であるとは限らない。そのスコープで書き込みされないというだけ。ついでに言うと、mutable 指定されたメンバに対するアクセスは
const 性の担保の対象外になります)。

また、constexpr として定義されたオブジェクトは const 性を持つと言っても概ね問題ないと思いますが、逆は真ではありません。

他にマニアックな例としては、コンストラクタの戻り値を constexpr と書くことはできますが、const と書くことはできません、とか。

[code]

    class A {
            // こうは書ける。
            constexpr A() { }
    };
    
    class B {
            // こうは書けない (書けたとしても意味はないけれど)。
            const B() { }
    };
    
[/code]

