は、それがconstexpr変数を指すポインタを定義する方法は? C++入門第5回で
constexprのはそれが定義されたオブジェクト上のトップレベルのconstを課していることを言います。
それでは、どのように私は私がすなわちconstexprのオブジェクトを指すポインタ、低レベルのconstを課すconstexprの指定子のポインタを宣言することができますか?
は、それがconstexpr変数を指すポインタを定義する方法は? C++入門第5回で
constexprのはそれが定義されたオブジェクト上のトップレベルのconstを課していることを言います。
それでは、どのように私は私がすなわちconstexprのオブジェクトを指すポインタ、低レベルのconstを課すconstexprの指定子のポインタを宣言することができますか?
constexprオブジェクトは、他のオブジェクトと同じようにオブジェクトです。コンパイル時にその値が計算されても、これは変わりません。
多くの場合、オブジェクトがstatic const
の場合など、必要ではないことが分かっている場合、コンパイラは実際にconst値とオブジェクトを作成するコードを生成しないようにします。
constexpr
、static 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
まあ、簡単な説明。しかし、私はまだ低レベル 'constexpr'ポインタを定義する方法がない理由を理解できません。 – lsdsjy
constexprは型シグネチャの一部ではありません。コードジェネレーターへの指示にもっと似ています(もちろんそれ以上です)。したがって、constexprオブジェクトを指すという考え方は意味をなさない。なぜなら、 'constexpr int'型のオブジェクト(例えば)は存在しないからです。その型は 'const int'になります - コンパイル時に計算されることになります(静的なアサートやテンプレート引数などで使用できるように) –
優れた説明。どうもありがとう! – lsdsjy
は、少なくとも私の知る限り、その文を覚えているだけでconstexprのも、可変時のconstを暗示することを意味します。だから、constポインタが必要でしょうか?これまでに何を試しましたか?なぜあなたは最初にそれへのポインタが必要でしょうか?それとも、あなたは単にどのように知りたいのですか? –
表現全体が 'constexpr'かそれともそうでないかのどちらかです。部分的に* 'constexpr'なものを持っているのはあまり意味がありません。 'const'と' constexpr'も直交する概念です。 'constexpr'は' const'を意味しますが、逆の意味はありません。 –
@sleeptightpupper ...までC++ 14それ以降は、可変constexprオブジェクトを持つことは完全に合法です。 –