Warum kann ich einen Alias ​​nur direkt zuweisen, wenn es sich um einen Zeiger handelt?

8
%Vor%

Warum ist die b Zuweisung gültig, aber nicht die c Zuweisung? Mir ist klar, dass letzteres mit einer Besetzung möglich ist, aber ich frage mich, was die Gründe für diese Einschränkung sind.

    
rcorre 31.07.2017, 17:49
quelle

3 Antworten

5

Gemäß der Spezifikation gehen :

  

Ein Wert x ist in jedem dieser Fälle einer Variablen vom Typ T ("x ist T zuweisbar") zuzuordnen:

     
  • ...
  •   
  • x's Typ V und T haben identische zugrundeliegende Typen und mindestens einer von V oder T ist kein benannter Typ.
  •   
  • ...
  •   

Auch zur Definition von "unbenannt":

  

Ein Typ bestimmt die Menge von Werten und Operationen, die für Werte dieses Typs spezifisch sind. Typen können benannt oder unbenannt sein. Benannte Typen werden durch einen (möglicherweise qualifizierten) Typnamen angegeben; unbenannte Typen werden mit einem Typliteral angegeben, das aus vorhandenen Typen einen neuen Typ zusammensetzt.

Im Wesentlichen können Sie sich einen benannten Typ als einen beliebigen Typ vorstellen, der nur als Bezeichner oder als durch Punkte getrennte Bezeichner dargestellt werden kann. Zum Beispiel foo oder Foo.Bar .

In Ihrem Beispiel ordnen Sie immer zwischen Variablen mit demselben zugrunde liegenden Typ zu. Die Frage ist, ob mindestens einer der beteiligten Typen "unbenannt" ist.

In diesem Fall weisen Sie &a{} , das ist ein *a (unbenannt), einer Variablen vom benannten Typ b zu. Das funktioniert. Wenn Sie jedoch a{} (benannter Typ a ) einer Variablen vom Typ c zuweisen, wird keiner der Namen unbenannt und Sie erhalten einen Fehler.

    
Stephen Weinberg 31.07.2017 18:46
quelle
3

Gemäß der Spezifikation im Zuweisbarkeit -Teil a value x is assignable to a variable of type T ("x is assignable to T") ... x's type V and T have identical underlying types and at least one of V or T is not a named type .

Wert &a{} ist kein benannter Typ. Es ist ein Zeiger auf a , bedeutet *a . Der zugrunde liegende Typ von Wert &a{} und Typ b ist *a , Zeiger auf a . Daher können wir einer Variable vom Typ &a{} den Wert b zuweisen.

Aber der Wert a{} , dessen Typ a ist, kann keiner Variablen vom Typ c zugewiesen werden, da sie keine dieser Bedingungen und ihre zugrunde liegenden Typen ( a und c ) erfüllt nicht dasselbe.

    
Kaveh Shahbazian 31.07.2017 18:32
quelle
0

Wie bereits erwähnt, geht es um die Zuordnungsmöglichkeit unbenannter Typen, nicht um Zeiger.

%Vor%

kompiliert.

    
Uvelichitel 31.07.2017 19:33
quelle

Tags und Links