Ein consExpr-Objekt ist ein Objekt wie jedes andere. Die Tatsache, dass sein Wert zur Kompilierzeit berechnet wird, ändert dies nicht. Der Compiler versucht häufig zu vermeiden, dass tatsächlich Code ausgegeben wird, um konstante Werte und Objekte zu erzeugen, wenn er weiß, dass sie niemals benötigt werden, zum Beispiel, wenn Objekte static const
sind.
Durch die Adresse eines Objekts, ob constexpr
, static const
oder eine automatische Variable, wird der Compiler gezwungen, das Objekt tatsächlich zu erstellen. So
:
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);
}
Ergebnisse in:
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
Mindestens soweit ich diese Aussage erinnern, bedeutet nur, dass constexpr auch const auf die Variable impliziert. Also würde es einen const Zeiger benötigen? Was hast du bisher versucht? Warum brauchen Sie überhaupt einen Zeiger darauf? Oder willst du nur wissen wie? –
Entweder ist der gesamte Ausdruck "constexpr" oder nicht. Es macht nicht wirklich viel Sinn etwas zu haben, das * teilweise * 'conexpr' ist. "const" und "constexpr" sind ebenfalls orthogonale Konzepte. "constexpr" impliziert "const", aber nicht umgekehrt. –
@sleeptightpupper ... bis C++ 14 danach ist es vollkommen legal, veränderliche consxpr-Objekte zu haben –