Warum sind Arrays von Referenzen illegal?

149

Der folgende Code wird nicht kompiliert.

int a = 1, b = 2, c = 3;
int& arr[] = {a,b,c,8};

Was sagt der C ++ - Standard dazu?

Ich weiß, ich könnte eine Klasse deklarieren, die eine Referenz enthält, und dann ein Array dieser Klasse erstellen, wie unten gezeigt. Aber ich möchte wirklich wissen, warum der obige Code nicht kompiliert wird.

struct cintref
{
    cintref(const int & ref) : ref(ref) {}
    operator const int &() { return ref; }
private:
    const int & ref;
    void operator=(const cintref &);
};

int main() 
{
  int a=1,b=2,c=3;
  //typedef const int &  cintref;
  cintref arr[] = {a,b,c,8};
}

Es ist möglich, ein Array von Referenzen zu simulieren, struct cintrefanstatt es const int &zu simulieren.

Alexey Malistov
quelle
1
Selbst wenn das Array gültig wäre, würde das Speichern eines rohen '8'-Werts darin nicht funktionieren. Wenn Sie "intlink value = 8;" gemacht haben, würde es schrecklich sterben, weil es so ziemlich nur in "const int & value = 8;" übersetzt wird. Eine Referenz muss auf eine Variable verweisen.
Grant Peters
3
intlink value = 8;funktioniert. Überprüfen Sie, ob Sie nicht glauben.
Alexey Malistov
7
Wie Alexey betont, ist es durchaus gültig, einen r-Wert an eine konstante Referenz zu binden.
Avakar
1
Was nicht funktioniert, ist das operator=. Referenzen können nicht erneut eingesetzt werden. Wenn Sie wirklich eine solche Semantik wollen - obwohl ich persönlich nicht eine Situation gefunden , in dem sie praktisch nützlich sind - dann std::reference_wrapperwäre der Weg , es zu tun, wie es tatsächlich einen Zeiger speichert , sondern bietet Referenz wie operators und ist erneutes Einsetzen ermöglichen. Aber dann würde ich einfach einen Zeiger benutzen!
underscore_d
1
Der Operator = ist privat und nicht implementiert, auch bekannt als was in C ++ 11 = löschen ist.
Jimmy Hartzell

Antworten:

148

Bei der Beantwortung Ihrer Frage zum Standard kann ich den C ++ - Standard §8.3.2 / 4 zitieren :

Es dürfen keine Hinweise auf Referenzen, werden keine Anordnungen von Referenzen und keine Hinweise auf Referenzen.

Kirill V. Lyadvinsky
quelle
32
Was gibt es noch zu sagen?
Polyglot
9
Es sollte Arrays von Referenzen geben, aus dem gleichen Grund, aus dem wir Arrays von Zeigern haben, die gleichen Informationen, aber unterschiedliche Handhabung, nicht wahr?
Neu-Rah
6
Wenn Compiler-Entwickler als Erweiterung entscheiden würden, Referenzarrays zuzulassen, wäre dies dann ein Erfolg? Oder gibt es einige echte Probleme - vielleicht mehrdeutigen Code -, die es einfach zu verwirrend machen würden, diese Erweiterung zu definieren?
Aaron McDaid
23
@AaronMcDaid Ich denke, der wahre Grund - der in dieser und ähnlichen Diskussionen so auffällig fehlt - ist, dass man, wenn man eine Reihe von Referenzen hätte, möglicherweise zwischen der Adresse eines Elements und der Adresse seines Referenten unterscheiden würde. Der unmittelbare Einwand gegen "Sie können keine Referenz in ein Array / einen Container / was auch immer einfügen" besteht darin, dass Sie eine Referenz einfügen können , structderen einziges Mitglied eine Referenz ist. Auf diese Weise haben Sie jetzt sowohl eine Referenz als auch ein übergeordnetes Objekt zu benennen. Dies bedeutet, dass Sie jetzt eindeutig angeben können, welche Adresse Sie möchten. Scheint offensichtlich ... also warum hat es niemand gesagt?
underscore_d
95
@polyglot What more is there to say?Eine Begründung für warum ? Ich beschäftige mich ausschließlich mit dem Standard, aber nur das Zitieren und die Annahme, dass dies das Ende der Diskussion ist, scheint ein sicherer Weg zu sein, um das kritische Denken der Benutzer zu zerstören - zusammen mit jeglichem Potenzial für die Entwicklung der Sprache, z. B. über die Grenzen der Auslassung hinaus oder künstliche Einschränkung. Es gibt zu viel, weil der Standard "hier - und nicht genug" sagt, und es ist aus den folgenden praktischen Gründen sehr sinnvoll, das zu sagen. Ich weiß nicht, warum Upvotes so eifrig zu Antworten fließen, die nur die ersteren sagen, ohne auch nur zu versuchen, die letzteren zu erforschen.
underscore_d
64

Referenzen sind keine Objekte. Sie haben keinen eigenen Speicher, sie verweisen nur auf vorhandene Objekte. Aus diesem Grund ist es nicht sinnvoll, Referenzarrays zu haben.

Wenn Sie ein leichtes Objekt möchten, das auf ein anderes Objekt verweist, können Sie einen Zeiger verwenden. Sie können ein structmit einem Referenzelement nur als Objekte in Arrays verwenden, wenn Sie für alle Referenzelemente für alle structInstanzen eine explizite Initialisierung bereitstellen . Referenzen können nicht standardmäßig initialisiert werden.

Bearbeiten: Wie jia3ep bemerkt, gibt es im Standardabschnitt zu Deklarationen ein explizites Verbot von Arrays von Referenzen.

CB Bailey
quelle
6
Referenzen sind von Natur aus dieselben wie konstante Zeiger, und daher benötigen sie etwas Speicher (Speicher), um auf etwas zu verweisen.
Inazaruk
7
Nicht unbedingt. Der Compiler kann möglicherweise das Speichern der Adresse vermeiden, wenn es sich beispielsweise um einen Verweis auf ein lokales Objekt handelt.
EFraim
4
Nicht unbedingt. Referenzen in Strukturen beanspruchen normalerweise etwas Speicherplatz. Lokale Referenzen tun dies oft nicht. In beiden Fällen sind Referenzen im engeren Sinne keine Objekte, und (das war für mich neu) benannte Referenzen sind eigentlich keine Variablen .
CB Bailey
26
Ja, aber dies ist ein Implementierungsdetail. Ein Objekt im C ++ - Modell ist ein typisierter Speicherbereich. Eine Referenz ist ausdrücklich kein Objekt und es gibt keine Garantie dafür, dass sie in einem bestimmten Kontext Speicherplatz beansprucht.
CB Bailey
9
Sagen Sie es so: Sie können eine Struktur von nur 16 Refs zu Foo haben und sie genauso verwenden, wie ich mein Array von Refs verwenden möchte - außer dass Sie nicht in die 16 Foo-Referenzen indizieren können . Dies ist meiner Meinung nach eine Sprachwarze.
Greggo
28

Dies ist eine interessante Diskussion. Es ist klar, dass Arrays von Refs absolut illegal sind, aber meiner Meinung nach ist der Grund dafür nicht so einfach zu sagen: "Sie sind keine Objekte" oder "Sie haben keine Größe". Ich möchte darauf hinweisen, dass Arrays selbst in C / C ++ keine vollwertigen Objekte sind. Wenn Sie dem widersprechen, versuchen Sie, einige STL-Vorlagenklassen mithilfe eines Arrays als Vorlagenparameter 'class' zu instanziieren, und sehen Sie, was passiert. Sie können sie nicht zurückgeben, zuweisen oder als Parameter übergeben. (Ein Array-Parameter wird als Zeiger behandelt). Es ist jedoch legal, Arrays von Arrays zu erstellen. Referenzen haben eine Größe, die der Compiler berechnen kann und muss - Sie können eine Referenz nicht sizeof (), aber Sie können eine Struktur erstellen, die nur Referenzen enthält. Die Größe reicht aus, um alle Zeiger zu enthalten, die die Referenzen implementieren. Sie können'

struct mys {
 int & a;
 int & b;
 int & c;
};
...
int ivar1, ivar2, arr[200];
mys my_refs = { ivar1, ivar2, arr[12] };

my_refs.a += 3  ;  // add 3 to ivar1

Tatsächlich können Sie diese Zeile zur Strukturdefinition hinzufügen

struct mys {
 ...
 int & operator[]( int i ) { return i==0?a : i==1? b : c; }
};

... und jetzt habe ich etwas, das VIEL wie eine Reihe von Refs aussieht:

int ivar1, ivar2, arr[200];
mys my_refs = { ivar1, ivar2, arr[12] };

my_refs[1] = my_refs[2]  ;  // copy arr[12] to ivar2
&my_refs[0];               // gives &my_refs.a == &ivar1

Dies ist kein echtes Array, sondern eine Operatorüberladung. Es werden keine Dinge ausgeführt, die Arrays normalerweise tun, wie z. B. sizeof (arr) / sizeof (arr [0]). Aber es macht genau das, was ich von einer Reihe von Referenzen möchte, mit vollkommen legalem C ++. Außer (a) es ist mühsam, mehr als 3 oder 4 Elemente einzurichten, und (b) es führt eine Berechnung mit einer Reihe von ?: Dies kann mithilfe der Indizierung erfolgen (nicht mit der normalen C-Zeiger-Berechnungssemantik-Indizierung) , aber trotzdem indizieren). Ich würde gerne einen sehr begrenzten 'Array of Reference'-Typ sehen, der dies tatsächlich kann. Das heißt, ein Array von Referenzen würde nicht als allgemeines Array von Dingen behandelt, die Referenzen sind, sondern es wäre ein neues 'Array von Referenzen'. mit Vorlagen machen).

Dies würde wahrscheinlich funktionieren, wenn Ihnen diese Art von Bösartigkeit nichts ausmacht: Neufassung von '* this' als Array von int * 's und Rückgabe einer Referenz aus einem: (nicht empfohlen, aber es zeigt, wie das richtige' Array ' würde funktionieren):

 int & operator[]( int i ) { return *(reinterpret_cast<int**>(this)[i]); }
Greggo
quelle
1
Sie können dies in C ++ 11 tun std::tuple<int&,int&,int&> abcref = std::tie( a,b,c)- wodurch ein "Array" von Referenzen erstellt wird, die nur durch Konstanten zur Kompilierungszeit mit std :: get indiziert werden können. Aber du kannst es nicht tun std::array<int&,3> abcrefarr = std::tie( a,b,c). Vielleicht gibt es einen Weg, den ich nicht kenne. Es scheint mir, dass es eine Möglichkeit geben sollte, eine Spezialisierung zu schreiben, std::array<T&,N>die dies kann - und damit eine Funktion, std::tiearray(...)die eine solche zurückgibt (oder es erlaubt std::array<T&,N>, Initialisierer zu akzeptieren, die Adressen = {& v1, & v2 usw.} enthalten)
greggo
Ihr Vorschlag ist albern (IMO), und in Ihrer letzten Zeile wird davon ausgegangen, dass ein Int einen Zeiger enthalten kann (normalerweise falsch, zumindest dort, wo ich arbeite). Aber dies ist die einzige Antwort hier mit einer legitimen Begründung dafür, warum Arrays von Referenzen verboten sind, also +1
Nemo
@Nemo war es nicht wirklich als Vorschlag gedacht, sondern nur um zu veranschaulichen, dass die Funktionalität einer solchen Sache auf den ersten Blick nicht absurd ist. Ich stelle in meinem letzten Kommentar fest, dass c ++ Dinge hat, die nahe kommen. In der letzten Zeile, auf die Sie verweisen, wird außerdem davon ausgegangen, dass der Speicher, der eine Referenz auf ein int implementiert , sinnvollerweise als Zeiger auf int aliasiert werden kann - die Struktur enthält Referenzen, keine Ints - und dies ist in der Regel der Fall. Ich behaupte nicht, dass es portabel ist (oder sogar vor Regeln für undefiniertes Verhalten sicher ist). es sollte veranschaulichen, wie die Indizierung unter der Haube verwendet werden kann, um all das zu vermeiden?:
greggo
Meinetwegen. Aber ich denke, diese Idee ist "auf den ersten Blick absurd", und genau deshalb sind Anordnungen von Referenzen nicht erlaubt. Ein Array ist in erster Linie ein Container. Alle Container benötigen einen Iteratortyp, damit Standardalgorithmen angewendet werden können. Der Iteratortyp für "Array von T" ist normalerweise "T *". Was wäre der Iteratortyp für ein Array von Referenzen? Die Menge an Sprach-Hacking, die erforderlich wäre, um all diese Probleme zu lösen, ist für eine im Wesentlichen nutzlose Funktion lächerlich. Eigentlich mache ich das vielleicht zu einer eigenen Antwort :-)
Nemo
@Nemo Es muss nicht Teil der Kernsprache sein, daher ist der Iterator-Typ "benutzerdefiniert" keine große Sache. Alle verschiedenen Containertypen haben ihre Iteratortypen. In diesem Fall würde der dereferenzierte Iterator auf die Zielobjekte verweisen, nicht auf die Refs im Array, was vollständig mit dem Verhalten des Arrays übereinstimmt. Möglicherweise ist noch ein wenig neues C ++ - Verhalten erforderlich, um es als Vorlage zu unterstützen. Das sehr einfache std::array<T,N>, im App-Code leicht zu definierende Element wurde erst in c ++ 11 zu std :: hinzugefügt, vermutlich weil es schwierig ist, dies ohne Möglichkeit zu haben do = {1,2,3};war , dass ‚Sprache Hacking‘?
Greggo
28

Kommentar zu Ihrer Bearbeitung:

Bessere Lösung ist std::reference_wrapper.

Details: http://www.cplusplus.com/reference/functional/reference_wrapper/

Beispiel:

#include <iostream>
#include <functional>
using namespace std;

int main() {
    int a=1,b=2,c=3,d=4;
    using intlink = std::reference_wrapper<int>;
    intlink arr[] = {a,b,c,d};
    return 0;
}
Youw
quelle
Hallo, das wurde bereits im Jahr 09 angegeben. Tipp Suche nach neueren Beiträgen :)
Stígandr
9
Der Beitrag ist alt, aber nicht jeder kennt die Lösung mit reference_wrapper. Die Leute müssen sich über STL und STDlib von C ++ 11 informieren.
Youw
Dies gibt einen Link und einen Beispielcode, anstatt nur den Namen der Klasse zu erwähnen reference_wrapper.
David Stone
12

Ein Array kann implizit in einen Zeiger konvertiert werden, und der Verweis auf eine Referenz ist in C ++ unzulässig

EFraim
quelle
11
Es ist wahr, dass Sie keinen Zeiger auf eine Referenz haben können, aber dies ist nicht der Grund, warum Sie kein Array von Referenzen haben können. Sie sind vielmehr beide Symptome dafür, dass Referenzen keine Objekte sind.
Richard Corden
1
Eine Struktur kann nur Referenzen enthalten und hat eine Größe, die proportional zu ihrer Anzahl ist. Wenn Sie ein Array von Refs 'arr' hätten, wäre die normale Array-zu-Zeiger-Konvertierung nicht sinnvoll, da 'Zeiger-zu-Referenz' keinen Sinn ergibt. aber es wäre sinnvoll, nur die Verwendung arr [i], in der gleichen Weise wie st.ref zu machen , wenn ‚st‘ ist eine Struktur ein ref enthält. Hmm. Aber & arr [0] würde die Adresse des ersten referenzierten Objekts angeben, und & arr [1] - & arr [0] wäre nicht dasselbe wie & arr [2] - & arr [1] - es würde viel Fremdheit erzeugen.
Greggo
11

Gegeben int& arr[] = {a,b,c,8};, was ist sizeof(*arr)?

Überall sonst wird eine Referenz einfach als das Ding selbst behandelt, sizeof(*arr)sollte es also einfach sein sizeof(int). Dies würde jedoch dazu führen, dass die Array-Zeiger-Arithmetik für dieses Array falsch ist (vorausgesetzt, dass Referenzen nicht die gleiche Breite haben, ist ints). Um die Mehrdeutigkeit zu beseitigen, ist es verboten.

PaulMurrayCbr
quelle
Ja. Sie können kein Array von etwas haben, es sei denn, es hat eine Größe. Wie groß ist eine Referenz?
David Schwartz
4
@DavidSchwartz Machen Sie eine, structderen einziges Mitglied diese Referenz ist und finden Sie es heraus ..?
underscore_d
3
Dies sollte die akzeptierte Antwort sein, nicht die dumme pedantische, die einfach den Standard auf das OP wirft.
Tyson Jacobs
Vielleicht gibt es einen Tippfehler. "unter der Annahme, dass Referenzen nicht die gleichen Breiten haben, ist Ints" sollte "unter der Annahme, dass Referenzen nicht die gleichen Breiten wie Ints haben" sein. Änderung ist zu als .
Zhenguoli
Aber warten Sie, nach dieser Logik konnten Sie keine Referenzmitgliedsvariablen haben.
Tyson Jacobs
10

Denn wie viele hier gesagt haben, sind Referenzen keine Objekte. Sie sind einfach Aliase. Einige Compiler implementieren sie möglicherweise als Zeiger, aber der Standard erzwingt / spezifiziert dies nicht. Und da Referenzen keine Objekte sind, können Sie nicht darauf verweisen. Das Speichern von Elementen in einem Array bedeutet, dass es eine Art Indexadresse gibt (dh auf Elemente an einem bestimmten Index zeigen). und deshalb können Sie keine Arrays von Referenzen haben, weil Sie nicht auf sie verweisen können.

Verwenden Sie stattdessen boost :: reference_wrapper oder boost :: tuple. oder nur Zeiger.

Navigator
quelle
5

Ich glaube, die Antwort ist sehr einfach und hat mit semantischen Referenzregeln und dem Umgang mit Arrays in C ++ zu tun.

Kurz gesagt: Referenzen können als Strukturen betrachtet werden, die keinen Standardkonstruktor haben, daher gelten dieselben Regeln.

1) Referenzen haben semantisch keinen Standardwert. Referenzen können nur durch Referenzieren erstellt werden. Referenzen haben keinen Wert, der das Fehlen einer Referenz darstellt.

2) Beim Zuweisen eines Arrays der Größe X erstellt das Programm eine Sammlung von standardmäßig initialisierten Objekten. Da die Referenz keinen Standardwert hat, ist das Erstellen eines solchen Arrays semantisch unzulässig.

Diese Regel gilt auch für Strukturen / Klassen, die keinen Standardkonstruktor haben. Das folgende Codebeispiel wird nicht kompiliert:

struct Object
{
    Object(int value) { }
};

Object objects[1]; // Error: no appropriate default constructor available
Kristupas A.
quelle
1
Sie können ein Array von erstellen Object, Sie müssen nur sicherstellen, dass Sie alle initialisieren : Object objects[1] = {Object(42)};. In der Zwischenzeit können Sie kein Array von Referenzen erstellen, selbst wenn Sie alle initialisieren.
Anton3
4

Mit dieser Vorlagenstruktur können Sie ziemlich nahe kommen. Sie müssen jedoch mit Ausdrücken initialisieren, die Zeiger auf T und nicht auf T sind. Obwohl Sie auf einfache Weise ein 'fake_constref_array' erstellen können, können Sie dies nicht wie im Beispiel des OP ('8') an rvalues ​​binden.

#include <stdio.h>

template<class T, int N> 
struct fake_ref_array {
   T * ptrs[N];
  T & operator [] ( int i ){ return *ptrs[i]; }
};

int A,B,X[3];

void func( int j, int k)
{
  fake_ref_array<int,3> refarr = { &A, &B, &X[1] };
  refarr[j] = k;  // :-) 
   // You could probably make the following work using an overload of + that returns
   // a proxy that overloads *. Still not a real array though, so it would just be
   // stunt programming at that point.
   // *(refarr + j) = k  
}

int
main()
{
    func(1,7);  //B = 7
    func(2,8);     // X[1] = 8
    printf("A=%d B=%d X = {%d,%d,%d}\n", A,B,X[0],X[1],X[2]);
        return 0;
}

-> A = 0 B = 7 X = {0,8,0}

Greggo
quelle
2

Ein Referenzobjekt hat keine Größe. Wenn Sie schreiben sizeof(referenceVariable), erhalten Sie die Größe des Objekts, auf das verwiesen wird referenceVariable, nicht die der Referenz selbst. Es hat keine eigene Größe, weshalb der Compiler nicht berechnen kann, wie viel Größe das Array benötigen würde.

Carl Seleborg
quelle
3
Wenn ja, wie kann ein Compiler die Größe einer Struktur berechnen, die nur eine Referenz enthält?
Juster
Der Compiler kennt die physische Größe einer Referenz - sie entspricht einem Zeiger. Referenzen sind in der Tat semantisch verherrlichte Zeiger. Der Unterschied zwischen Zeigern und Referenzen besteht darin, dass Referenzen einige semantische Regeln enthalten, um die Anzahl der Fehler zu verringern, die Sie im Vergleich zu Zeigern erstellen können.
Kristupas A.
2

Wenn Sie etwas in einem Array speichern, muss dessen Größe bekannt sein (da die Array-Indizierung von der Größe abhängt). Gemäß dem C ++ - Standard ist nicht angegeben, ob eine Referenz gespeichert werden muss oder nicht, sodass eine Indizierung eines Array von Referenzen nicht möglich wäre.

Pradyot
quelle
1
Aber wenn man diese Referenz in a setzt struct, wird auf magische Weise alles spezifiziert, genau definiert, garantiert und von deterministischer Größe. Warum besteht also dieser scheinbar völlig künstliche Unterschied?
underscore_d
... natürlich, wenn man tatsächlich darüber nachdenkt, was die Verpackung structverleiht, beginnen sich einige gute mögliche Antworten zu ergeben - aber für mich hat dies noch niemand getan, obwohl dies eine der unmittelbaren Herausforderungen für alle Gemeinsamen ist Gründe, warum Sie keine unverpackten Refs verwenden können.
underscore_d
2

Nur um das ganze Gespräch zu ergänzen. Da für Arrays aufeinanderfolgende Speicherorte zum Speichern des Elements erforderlich sind, kann beim Erstellen eines Arrays von Referenzen nicht garantiert werden, dass sie sich an aufeinanderfolgenden Speicherorten befinden, sodass der Zugriff ein Problem darstellt und wir daher nicht einmal alle mathematischen Operationen anwenden können Array.

Amit Kumar
quelle
Betrachten Sie den folgenden Code aus der ursprünglichen Frage: int a = 1, b = 2, c = 3; int & arr [] = {a, b, c, 8}; Es ist sehr unwahrscheinlich, dass sich a, b, c an einem aufeinanderfolgenden Speicherort befinden.
Amit Kumar
Dies ist bei weitem nicht das Hauptproblem beim Konzept, Referenzen in einem Container zu halten.
underscore_d
0

Betrachten Sie ein Array von Zeigern. Ein Zeiger ist wirklich eine Adresse; Wenn Sie also das Array initialisieren, sagen Sie dem Computer analog: "Weisen Sie diesen Speicherblock zu, um diese X-Nummern (die Adressen anderer Elemente sind) zu speichern." Wenn Sie dann einen der Zeiger ändern, ändern Sie nur das, worauf er zeigt. es ist immer noch eine numerische Adresse, die selbst an derselben Stelle sitzt.

Eine Referenz ist analog zu einem Alias. Wenn Sie eine Reihe von Referenzen deklarieren würden, würden Sie dem Computer im Grunde sagen: "Ordnen Sie diesen amorphen Speicherklumpen zu, der aus all diesen verschiedenen verstreuten Elementen besteht."

Dan Tao
quelle
1
Warum führt die Herstellung eines structMitglieds, dessen einziges Mitglied eine Referenz ist, zu etwas völlig Legalem, Vorhersehbarem und Nicht-Amorphem? Warum muss ein Benutzer eine Referenz einschließen, damit er auf magische Weise Array-fähige Kräfte erhält, oder handelt es sich nur um eine künstliche Einschränkung? IMO keine Antwort hat dies direkt angesprochen. Ich gehe davon aus, dass die Widerlegung lautet: "Das Wrapping-Objekt stellt sicher, dass Sie die Wertesemantik in Form des Wrapping-Objekts verwenden können, sodass Sie die Garantien für Werte haben, die erforderlich sind, weil z. B. wie man zwischen Element- und Schiedsrichteradresse unterscheiden würde." ... Ist es das, was du meintest?
underscore_d
-2

Eigentlich ist dies eine Mischung aus C- und C ++ - Syntax.

Sie sollten entweder reine C-Arrays verwenden, die keine Referenzen enthalten können, da Referenzen nur Teil von C ++ sind. Oder Sie gehen den C ++ - Weg und verwenden das std::vectoroderstd::array Klasse für Ihren Zweck.

Was den bearbeiteten Teil betrifft: Obwohl das structein Element aus C ist, definieren Sie einen Konstruktor und Operatorfunktionen, die es zu einem C ++ machen class. Folglich structwürden Sie nicht in reinem C kompilieren!

Thargon
quelle
Worauf willst du hinaus? std::vectoroder std::arraykann auch keine Referenzen enthalten. Der C ++ Standard ist ziemlich explizit, dass kein Container kann.
underscore_d