2016-06-13 8 views
1

は、それがconstexpr変数を指すポインタを定義する方法は? C++入門第5回で

constexprのはそれが定義されたオブジェクト上のトップレベルのconstを課していることを言います。

それでは、どのように私は私がすなわちconstexprのオブジェクトを指すポインタ、低レベルのconstを課すconstexprの指定子のポインタを宣言することができますか?

+1

は、少なくとも私の知る限り、その文を覚えているだけでconstexprのも、可変時のconstを暗示することを意味します。だから、constポインタが必要でしょうか?これまでに何を試しましたか?なぜあなたは最初にそれへのポインタが必要でしょうか?それとも、あなたは単にどのように知りたいのですか? –

+0

表現全体が 'constexpr'かそれともそうでないかのどちらかです。部分的に* 'constexpr'なものを持っているのはあまり意味がありません。 'const'と' constexpr'も直交する概念です。 'constexpr'は' const'を意味しますが、逆の意味はありません。 –

+0

@sleeptightpupper ...までC++ 14それ以降は、可変constexprオブジェクトを持つことは完全に合法です。 –

答えて

1

constexprオブジェクトは、他のオブジェクトと同じようにオブジェクトです。コンパイル時にその値が計算されても、これは変わりません。

多くの場合、オブジェクトがstatic constの場合など、必要ではないことが分かっている場合、コンパイラは実際にconst値とオブジェクトを作成するコードを生成しないようにします。

constexprstatic const、またはauto変数のいずれかのオブジェクトのアドレスをとることによって、コンパイラは実際にオブジェクトを強制的に作成します。だから、

:中

constexpr int i = 5; // need not be actually created 

const int* pi = &i;  // but now it must be, because we took its address 

constexpr const int* pi2 = &i; // constexpr pointer to const object - we took its address so it must exist 


const void emit(int); 

int main() 
{ 
    emit(i); 
    emit(*pi); 
    emit(*pi2); 
} 

結果は:

main: 
     subq $8, %rsp 
     movl $5, %edi   <-- compiler knows it's a fixed value 
     call emit(int) 

     movq pi(%rip), %rax <-- compiler dereferences the pointer 
     movl (%rax), %edi 
     call emit(int) 

     movl $5, %edi  <-- compiler knows it's a fixed value 
     call emit(int) 

     xorl %eax, %eax 
     addq $8, %rsp 
     ret 
pi: 
     .quad i 
i: 
     .long 5 
+0

まあ、簡単な説明。しかし、私はまだ低レベル 'constexpr'ポインタを定義する方法がない理由を理解できません。 – lsdsjy

+0

constexprは型シグネチャの一部ではありません。コードジェネレーターへの指示にもっと似ています(もちろんそれ以上です)。したがって、constexprオブジェクトを指すという考え方は意味をなさない。なぜなら、 'constexpr int'型のオブジェクト(例えば)は存在しないからです。その型は 'const int'になります - コンパイル時に計算されることになります(静的なアサートやテンプレート引数などで使用できるように) –

+0

優れた説明。どうもありがとう! – lsdsjy

関連する問題