2016-06-13 5 views
1

In C++ Primer 5., heißt es, dassWie definiert man einen Zeiger, der auf eine consExpr-Variable zeigt?

constexpr eine Top-Level const auf den Objekten erlegt es definiert.

So, wie ich kann ich einen Zeiger mit einem constexpr Spezifizierer einen Low-Level-const zur Einführung, das heißt einen Zeiger auf ein constexpr Objekt erklären?

+1

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? –

+0

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. –

+0

@sleeptightpupper ... bis C++ 14 danach ist es vollkommen legal, veränderliche consxpr-Objekte zu haben –

Antwort

1

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 
+0

Nun, einfache Beschreibung. Aber ich kann immer noch nicht herausfinden, warum es keinen solchen Weg gibt, einen Low-Level- "constexpr" -Zeiger zu definieren? – lsdsjy

+0

consExpr ist nicht Teil der Typsignatur. Es ist mehr wie eine Anweisung an den Code-Generator (es ist natürlich mehr als das). Die Idee, auf ein conexpr-Objekt zu zeigen, macht also keinen Sinn, weil es beispielsweise kein Objekt vom Typ constexpr int gibt. Der Typ wäre 'const int' - es würde einfach zur Kompilierungszeit berechnet werden (also könnte man es beispielsweise in statischen Asserts und Template-Argumenten verwenden) –

+0

Hervorragende Erklärung. Danke vielmals! – lsdsjy