Was wäre, wenn Sie einen Zeiger auf eine ganze Zahl mit dem Wert 42 benötigen? :)
C++ Referenzen sind wie automatisch dereferenzierte Zeiger. Man kann einen konstanten Verweis auf einen wörtlichen erstellen, wie folgen aus:
const int &x = 42;
Es erfordert effektiv die Compiler einen Zeiger mit der Adresse einer ganzen Zahl mit dem Wert 42 zu initialisieren, wie Sie anschließend diesen tun könnten:
const int *y = &x;
Kombinieren Sie das mit der Tatsache, dass Compiler Logik haben müssen, um zwischen einem Wert zu unterscheiden, der seine Adresse nicht genommen hat, und einem, der hat, also weiß es, es im Gedächtnis zu speichern. Die erste muss keinen Speicherort haben, da sie vollständig temporär und in einem Register gespeichert sein kann, oder sie kann durch Optimierung eliminiert werden. Nimmt die Adresse des Werts möglicherweise einen Aliasnamen an, kann der Compiler die Optimierung nicht verfolgen und verhindern. So kann die Anwendung des &
Operators den Wert, wie auch immer er ist, in den Speicher erzwingen.
Es ist also möglich, dass Sie einen Fehler gefunden haben, der diese beiden Effekte kombiniert.
Warum werden Sie den Compiler nicht nennen? – JaredPar
@JaredPar Vielleicht, weil er es erfunden hat.:) :) –
@JaredPar: Ich weiß, das ist ein bisschen nach der Tatsache (5 Jahre), aber VS2013 lässt mich dies für eine Klasse tun, d. H. 'Foo * p = & Foo()' aber nicht mit wörtlichen ganzen Zahlen. Es funktioniert nicht mehr, wenn ich es auf Warnstufe 4 hochgebe und Warnungen als Fehler behandle. Nach dem dies funktioniert für ganze Zahlen und Klassen, ich denke, es kann gültig sein C++: 'const int * p = & (const int &)42;' – Apriori