Ok, hatte ich zwar schon mal in anderen Beispielen gesehen und mich gewundert, warum man das übergibt und nicht ermittelt, aber wenn dass in c++ Standard ist, weiß ich jetzt mehr.
Das kommt aus C. Nicht aus C++. Das sind zwei verschiedene Sprachen
In C++ verwendet man Arrays heute eher weniger und nimmt lieber Container wie Vektoren. Die STL bietet mit std::array auch einen Container für klassische Arrays an der nicht in einen Zeiger zerfällt. Aber das gibt es auf den AVR Arduinos nicht.
Wenn ich euchrichtig verstanden habe, ist das der Weg als Referenz den Serenifly auch beschreibt?
Das ist eine Hilfsfunktion um die Größe zu berechnen. Dann muss man die Größe nicht in der eigentlichen Funktion behandeln. Sei es als Parameter oder dass man sie an der Stelle erst ausrechnet
Den Fehler bekommst du glaube weil das so erst mit C++14 geht. Und dafür fehlt bei dir der Compiler Switch. Oder es ist als GCC Extension erlaubt (z.B. Concepts Lite, was erst Teil von C++17 ist). Mit dem neustens in der IDE verfügbaren Compiler und der entsprechenden Option aktiviert sollte das auch kompilieren.
Das Entfernen von constexpr an der Stelle behebt zwar den Fehler, aber der Code macht eventuell was anderes.
Und int als Datentyp ist an der Stelle dämlich. Seit wann kann eine Größe negativ sein?
Templates sind Code Generatoren. Man gibt generische Typen an die vom Compiler dann damit ersetzt werden was eigentlich vorhanden ist. Das hat auch zur Folge dass zwei Funktionen generiert werden wenn du da zwei verschiedene Arrays übergibst.