2016-05-03 19 views
3

をconstexprのために割り当てることができない理由私は、次のコード右辺値が基準変数

constexpr int into(int a,int b) 
{ 
    int c=a*b; 
    return c; 
} 

int main() 
{ 
constexpr int &n=into(5,5); 

} 

を有し、私はキーワードconstexprがC++ 11に導入された(MSDNに)

を読んできましたC++で改善14。それは一定の表現を意味します。 constのように、変数に適用して、コードが値を変更しようとするとコンパイラエラーが発生するようにすることができます。

私はそれを読んだ後、私はconstexprconstの代わりに使用することができると考えますが、上記のコードのために私はconstexprが置き換えられた場合

`int main()': 
invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'` 

を述べるコンパイラエラーを取得しますconst、それは正常に動作します。私はこの行動を理解していません。誰かが光を当てることができますか?

+1

'constexpr'リファレンスはグローバル変数にバインドする必要があります。答え[ここ](http://stackoverflow.com/a/28614655/1460794)を参照してください。 – wally

+0

@ flatmouse、リプレイのおかげで...リンクの答えの1つは、 "参照は概念的には変数のアドレスを取ることと等価であり、ローカル変数のアドレスは定数ではありません"ここで私がconstを使うときそれは縛る。 constexpr.iだけでなく、constとconstexprの振る舞いも同じであると信じています –

+0

'into'の戻り値はどこにも保存されないが、その戻り値への参照を保存するという問題があるかもしれませんその参照はどこを指していなければなりませんか? – Oebele

答えて

3

constexprとマークされた式は、into(5,5)の結果をintリテラルとして処理するコンパイル時に解決されます。わかっているように、参照はC++のリテラルのintにバインドすることはできません。

はあなたが constexpr int x=into(5,5);を作ることによって、この作品を作ることができる

は、グローバルスコープで、メインはその後、参照はxにバインドすることを可能にすると呼ばれるmain前に解決するためにxを強制xからconstexpr const int参照を作成中に表示されます

constexpr int into(int a,int b) { 
    int c=a*b; 
    return c; 
} 

// guaranteed to be resolved before main is called 
constexpr int x = into(5,5); 

int main() { 
constexpr const int& n = x; 
static_assert(n == 25, "whoops!"); 
} 

質問に具体的に答えるには、これは右辺値または移動セマンティクスとは完全に直交していますが、ニュアンスはconstexprです。グローバルスコープが胸焼けあなたを与える場合

、あなたがxにもstaticを作り、私にはより自然に思える結合の参照、前に初期化を入れることができます:constとは異なり

constexpr int into(int a,int b) { 
    int c=a*b; 
    return c; 
} 

int main() { 
// guaranteed to be resolved before main is called 
static constexpr int x = into(5,5); 
constexpr const int& n = x; 
static_assert(n == 25, "whoops!"); 
} 
+1

"*私たちが知っているように、参照はC++のintリテラルにバインドすることはできません。" *、参照は何を意味していますか? –

+1

@ erip、あなたは 'intリテラルとして(5,5)に'言ったことはありません。わかっているように、参照はC++のintリテラルにバインドすることはできません。私はinto()関数を呼び出すと、rvalueであるint &&を返すと思います。定数参照に代入する必要があります。const int&n =を(5,5)に置くと問題はなくなりました。内部main..if constなぜconstexprがconstexprであることができないのですか?このケースを扱うものがありません –

+0

@PiotrSkotnicki私は 'int'リテラルへの参照を意味します。 :) 'int&x = 25;'は合法ではありません。あなたは 'int'リテラルへの' const'参照を確かに持つことができますが、それは 'constexpr'の解決法とは違っています。 – erip

6

intに適用され、 constexprキーワードは、参照タイプint&の変数にconstを直接適用しますが、影響はありません。

typedef int &int_ref; 

int main() { 
    int x = 1; 
    int &a = x;   // OK 
    int_ref b = x;  // OK, int_ref is 'int &' 
    const int &c = 1; // OK, reference to const int 
    const int_ref d = 1; // error: type of d is 'int &' 
         // qualifier on reference are being ignored 
} 

constexpr int &nconstexpr int_ref nconst int &nconst int_ref nが異なる修飾子を持っていながら、 同じです。

関連する問題