2014-11-23 7 views
9

Ich sehe keinen logischen Grund. Ich meine, Sie leicht die Anforderung durch die Verwendung einer Struktur, die ein Array Element wie diese überwunden werden können:Warum verbietet ISO C++ das Zurückgeben von Arrays?

template <size_t n> 
struct arr { int d[n]; }; 

auto fnReturningArray() 
{ 
    return arr<3>{0, 1, 2}; 
}; 

Welche genau die gleiche Art und Weise verhalten, als ob das Array direkt mit dem kleinen Unterschied zurückgeführt wird, dass Sie zuerst den Zugang sollten Strukturelement "d", um es zu verwenden. Auch der Standard selbst hat ähnliche Funktionen vom Typ 'std :: array' hinzugefügt. Es scheint also, dass die Implementierung möglich ist. Warum hat ISO C++ diese Aktion verboten? Vielleicht veraltete Code-Kompatibilität (aber ich kann kaum glauben, dass dies der Fall ist, da mit den anderen neuen Dingen, die hinzugefügt wurden, es lange weg ist, wie zum Beispiel die neue Bedeutung des Schlüsselworts 'auto').

+6

Da Arrays nicht kopiert werden können. – Columbo

+3

Arrays sind nicht kopierbar oder zuweisbar, daher können sie nicht zurückgegeben oder als Wert übergeben werden. Warum das so ist, das wäre eine gute Frage. – juanchopanza

+0

@Columbo Aber sie wurden im struct magisch kopierbar. – AnArrayOfFunctions

Antwort

3

Neben der Tatsache, dass der Standard nicht möglich ist, und die historischen Gründe, die erklären könnte, ist die Frage syntaktischen:

Stellen wäre es erlaubt sein: Wie würden Sie die Benennung von der unterscheiden ganze Reihe gegen den Rest der Array-Adresse, der gegen ein einzelnes Element:

auto fnReturningArray() 
{ 
    int a[3] = {0, 1, 2}; 
    return a;  // what is meant here ? the address of the array ? or the whole array ? 
}; 

Wenn Sie die Bedeutung der bestehenden Regeln ändern würde (wie tating, dass eine das gesamte Array wäre), würden Sie große Probleme mit Legacy haben Code.

+2

Vermutlich hätten Sie eine Regel, die besagt, dass Sie 'int [3]' zurückgeben, da dies der Typ von 'a' ist. Wenn die Sprache Arrays zurückgeben darf, dann wäre das vollkommen sinnvoll. Sie verwenden hier ein zirkuläres Argument. – juanchopanza

+8

Das ist einfach: 'a' ist ein Array, also würde man ein Array zurückgeben. Wenn Sie einen Zeiger auf das erste Element haben möchten, schreiben Sie '& a [0]'. So funktioniert C++ nicht, aber es wäre eine vollkommen sinnvolle Sprache. – hvd

+1

@hvd: Aber die Tatsache, dass C++ nicht funktioniert, bedeutet, dass es verwirrend/irreführend/mehrdeutige Syntax _in C++ _ wäre, wenn hinzugefügt. –

0

Die Antwort, wie ich es sehe, ist eine doppelte:

  1. Kompatibilität mit C. C auf diese Weise nicht funktioniert. Warum? Keine Ahnung. C war nie sehr logisch in verschiedenen Aspekten zu beginnen.

  2. C++ bevorzugt Bibliotheksfunktionen gegenüber Sprachfunktionen. Da C++ 98 der erste Standard war und die Grundlagen hauptsächlich von C kopiert wurden (siehe Punkt 1), wurde dies in der ersten größeren Revision, C++ 11, korrigiert, die den Bibliothekstyp std :: array einführt , als reines und einfaches Bibliotheksmerkmal, löst alle abscheulichen Eigenheiten, die C-artige Arrays mit sich bringen.

Fassen wir zusammen: auch wenn es Sinn machen könnte richtigen Wert Semantik für Arrays zu haben, es wird nie passieren, weil der scheinbare Mangel, ohne die Sprache komplexer als es schon gelöst werden kann, ist. Es ist extrem schwierig, Legacy- und Rückwärtskompatibilität zu beseitigen, also ist die aktuelle Option von std :: array wirklich, was Sie wollen. Benutze es. Es ist einfach. Du wirst es mögen. Viel.

Verwandte Themen