2009-07-22 5 views
4

Ein C++ - Compiler, den ich nicht benennen werde, lässt Sie die Adresse eines Literals nehmen, int * p = & 42;Warum können einige C++ Compiler die Adresse eines Literals annehmen?

42 eindeutig ist ein r-Wert und die meisten Compiler weigern sich, dies zu tun.

Warum würde ein Compiler dies zulassen? Was könntest du mit diesem anderen tun, als dich in den Fuß zu schießen?

+13

Warum werden Sie den Compiler nicht nennen? – JaredPar

+0

@JaredPar Vielleicht, weil er es erfunden hat.:) :) –

+0

@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

Antwort

5

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.

3

Denn 42 ist die Antwort auf das Leben, das Universum und alles. Wenn nach seiner Adresse gefragt wird, ist es die Antwort selbst.

+0

Ich möchte upvote aber es ist wirklich nicht hilfreich! Aber ich kann einen Kommentar up .. – MSN

+4

Ja, ich weiß, dass es nicht hilfreich ist, aber ich konnte mir nicht helfen, es war ein ... auf deutsch nennen wir es "Steilvorlage" :) – DaClown

+0

+1 weil du vermutlich alles gelernt hast, was gelernt werden soll Das und die Leute häufen sich ohne guten Grund an. –

0

Zunge leicht (Mutter keineswegs vollständig) in der Wange:

würde ich sagen, dass in C++ Anwendungscode die Adresse einer ganze Zahl, ob L-Wert oder R-Wert ist fast immer ein Fehler nehmen. Selbst wenn Sie Ganzzahlen verwenden, ist es wahrscheinlich ein Konstruktionsfehler, wenn Sie viel mehr tun als Schleifen oder Zählen zu steuern. Wenn Sie eine Ganzzahl an eine Funktion übergeben müssen, die sie ändern kann, verwenden Sie eine Referenz.

0

Es erfordert effektiv die Compiler einen Zeiger mit der Adresse einer ganzen Zahl mit dem Wert 42

zu initialisieren

Dann warum können wir in einigen Compilern nicht die Adresse eines Literals direkt nehmen?

int* ptr = &10; 

Die Referenz:

int& ref = 10; 

ist fast das gleiche wie ein Zeiger, obwohl ...

+0

'int & ref = 10;' nicht legal – curiousguy

Verwandte Themen