2017-02-16 1 views
0

In C++ Primer 5 sehe ich den Code:ist es ein Konflikt? über C++ Auto

const int a = 40; 
auto &b = a; 

Der Compiler b mit Typ ableiten kann: const int &.
Ich denke, das ist vernünftig, wie ein const int ist und wenn b int & Sie ihnen können wir den Wert eines const int ändern, was illegal ist.

Jedoch sagte das Buch, dass die automatische Abzug wird die Top-Level-const, mit dieser Regel im Code weglassen: auto &b = a; das eine hat nur int geben, sie wir, dass die B-Typ int & verschieben kann, hat die Konflikte, b hat den Typ const int &.

Eine andere Frage ist der Code:

auto &a = 8; 

Der Compiler kann nicht ableiten, dass ein const int & direkt während im Code eingeben hat:

const int a = 40; 
auto &b = a; 

der Compiler kann. Warum der Unterschied?

+5

Es ist unklar, was Sie fragen? Bitte formulieren Sie eine konkrete, konkrete Frage, die beantwortet werden muss. – YePhIcK

+4

Ich denke, dass das Wort "Defer" durch "Infer" ersetzt werden sollte. – myaut

+0

@myaut Nicht "inferieren", "ableiten". – Barry

Antwort

4

auto Abzug, mit ein paar kleineren Ausnahmen, funktioniert genau so wie normale Vorlage Abzug. Sagen wir, wir haben eine Funktion:

template <class T> void foo(T& param); 

const int a = 40; 
foo(a); 

In diesem Beispiel T-const int und die Art der param wäre const int& ableiten würde. Mit derselben Argumentation gibt Ihnen auto& b = a; einen Verweis auf const int.

foo(8) wird jedoch nicht kompiliert. T& kann nur an einen Lvalue binden und 8 ist kein Lvalue. Das ist also schlecht geformt. In ähnlicher Weise ist auto& a = 8; schlecht ausgebildet.

+0

aber warum 'const auto &j = 8;' kann arbeiten? – rengar

+0

Wenige kleine Ausnahmen? –

+0

@carry Weil 'T const &' * an rvalues ​​binden kann. 'T &' kann nicht. Das Gleiche gilt für Vorlagen. – Barry