const-correctness 2-dim member array



  • Hallo alle,

    bin leider C++ Kackb00n, wollte mir aus Jux aber doch mal eine billo Matrixklasse basteln. Ich weiß, dass es a) dafür etliche Bibliotheken und b) mit std::vector / std::array weniger Tränen gibt; mir geht es hier konkret um grundsätzliches Verständnis.

    #include <cstddef>
    #include <iostream>
    
    using std::cout;
    using std::size_t;
    
    template <typename T, size_t N>
    struct Matrix
    {
        T data[N][N];
    
        T const (&(operator[])(size_t idx))[N] /*const*/
        {
            return data[idx];
        }
    };
    
    int main() 
    { 
        Matrix<int, 3> e = {1, 0, 0, 0, 1, 0, 0, 0, 1};
    
        cout << e[0][0]; // ok
    
        const auto& ce = e;
        //cout << ce[0][0]; // error
    }
    

    Kann ich operator[] als const markieren? Wenn ich es so mache, wie im code angedeutet, bekomme ich folgenden Fehler:

    12:42: error: expected ‘;’ at end of member declaration
         T const (&(operator[])(size_t idx))[N] const
                                              ^
    13:5: error: expected unqualified-id before ‘{’ token
    

    Ich vermute, dass durch die mehrfache Indirektion das const irgendwo verloren geht. Geht das grundsätzlich nicht oder habe ich bloß syntaktisch daneben gehauen?



  • Was soll das werden?
    Ueberlade doch viel lieber den () operator oder biete gleich eine Memberfunktion an.



  • T const (&(operator[])(size_t idx))[N] const
    

    ->

    T const (&(operator[])(size_t idx) const)[N]
    


  • Kellerautomat schrieb:

    T const (&(operator[])(size_t idx))[N] const
    

    ->

    T const (&(operator[])(size_t idx) const)[N]
    

    Danke, lieber Kellerautomat, das habe ich gesucht. 👍


  • Mod

    Warum nicht

    auto operator[]( std::size_t idx ) const -> decltype((*data))
    {
    	return data[idx];
    }
    

    (Hier zeigt sich übrigens wieder eine Stärke von AUTO_RETURN - dass es nämlich Wertkategorien beachtet)


Anmelden zum Antworten