Klaus schrieb:
> Okay, der Code war eine vereinfachte Form des eigentlichen Problems. Bei
> diesem geht es um eine Template-Klasse mit folgenden Konstruktor:
>
>
1 | > template<class T, int S>
|
2 | > class Tree
|
3 | > {
|
4 | > public:
|
5 | > Tree(Node<T> (& objects)[S]);
|
6 | > // ...
|
7 | >
|
>
> Nun denke ich kann man mit etwas Phantasie das Problem erahnen :)
Nicht wirklich.
Das erklärt immer noch nicht, warum die Funktion eine Referenz lieferen
muss, und nicht einfach nur die Adresse des static Arrays.
Und auch hier in deinem Template frag ich mich, was die Referenz an
dieser Stelle verloren hat. Der Konstruktor übernimmt sowieso ein Array
und Arrays werden per Pointer übergeben. Die [S] Angabe ist nichts
anderes als syntaktischer Zucker, eine andere Schreibweise für einen
Pointer. Die Referenz bewirkt hier IMHO nichts (*), ausser das sie alles
syntaxmässig komplizierter macht.
Das hier ....
1 | static int* const & test()
|
2 | {
|
3 | static int x[] = {1, 1, 2, 3, 5};
|
4 | return x; // error!
|
5 | }
|
... sollte die Lösung für dein ursprüngliches Problem sein. Aber warum
da eine Referenz ins Spiel kommen soll, ist auch mir immer noch unklar.
(*) soll bedeuten: Ich sehe nicht, aus welchem Grund hier überhaupt eine
Referenz sein sollte, bzw. warum man sie hier braucht oder welchen Zweck
die Referenz hier erfüllen würde. Kann natürlich sein, dass ich einfach
nur nicht die zündende Idee erkannt habe.
Kann es sein, dass du da einen Trugschluss hast, und der Meinung bist,
bei ....
1 | void foo( int a[] )
|
2 | {
|
3 | ...
|
4 | }
|
würde tatsächlich das komplette Array während des Parameter Passings
umkopiert? Wenn ja, dann muss ich dich enttäuschen. Diese Schreibweise
(egal ob da jetzt noch eine Arraygröße angegeben ist oder nicht), ist
nur eine alternative Schreibweise für
1 | void foo( int * a )
|
2 | {
|
3 | ...
|
4 | }
|
Mehr steckt da nicht dahinter. Arrays werden IMMER per 'Pointer auf das
erste Argument' übergeben, egal welche Schreibweise du benutzt.