tr1::<array> Konstruktor



  • Hallo,

    wahrscheinlich ist es ganz einfach:
    Wieso kann ich die Template-Klasse array<typename, size_t> mit einer Initialisierungsliste ... initialisieren.

    Deklariert ist es folgendermaßen: (MSDN)

    array();
        array(const array& right);
    

    Und kann dann so verwendet werden:

    typedef std::tr1::array<int, 4> Myarray; 
    int main() 
    { 
        Myarray c0 = {0, 1, 2, 3}; 
    
    // display contents " 0 1 2 3" 
        for (Myarray::const_iterator it = c0.begin(); 
            it != c0.end(); ++it) 
            std::cout << " " << *it; 
        std::cout << std::endl; 
    
        Myarray c1(c0); 
    
    // display contents " 0 1 2 3" 
        for (Myarray::const_iterator it = c1.begin(); 
            it != c1.end(); ++it) 
            std::cout << " " << *it; 
        std::cout << std::endl; 
    
        return (0); 
    }
    

    Die Konstruktoren sind ja einmal ohne Parameter (Default-Konstruktor) und der andere ist ein Copy-Konstruktor ... verstehe ich gerade nicht.


  • Mod

    FrEEzE2046 schrieb:

    Deklariert ist es folgendermaßen: (MSDN)

    array();
        array(const array& right);
    

    Richtig, allerdings werden diese Konstruktoren nicht explizit, sondern nur impliziert durch den Compiler deklariert - array bleibt damit ein Aggregat. Nebenbei bemerkt steht die Signatur des copy-ctors nur deshalb fest, weil als Templateparameter nur nnormale Container-compatible Typen zulässig sind, was einen entsprechenden Copy-ctor voraussetzt (nicht so in C++0x - nicht das exakte Signatur eine besondere Rolle spielen würde...).
    Der copy-ctor eines array<auto_ptr<int> > etwa hätte die Form array(array&), weil das auch für auto_ptr so ist, nur ist ein auto_ptr eben kein zulässiges Argument.



  • Ich hab das mittlerweile schon rausbekommen, was du sagst, aber trotzdem danke für deine Antwort.
    Es konnte auch anders eigentlich nicht sein, was mich nur total gewundert hat (bzw. mmer noch tut), ist dass wenn man sich eine Instanz von array<> im Debugger anschaut, listet er direkt die Elemente (Indezes) des arrays auf.

    Das verstehe ich nicht. Normalerweiße müsste noch hinter der Instanz des Objekts erst einmal das (array-)Member kommen. Wenn ich auf die Deklaration schaue, kann ich nichts besonderes erkennen:

    template<typename _Ty, size_t _Size>
    class array
    {
    public:
         _Ty _Elems[_Size == 0 ? 1 : _Size];
    }
    


  • FrEEzE2046 schrieb:

    Ich hab das mittlerweile schon rausbekommen, was du sagst, aber trotzdem danke für deine Antwort.
    Es konnte auch anders eigentlich nicht sein, was mich nur total gewundert hat (bzw. mmer noch tut), ist dass wenn man sich eine Instanz von array<> im Debugger anschaut, listet er direkt die Elemente (Indezes) des arrays auf.

    Das verstehe ich nicht. Normalerweiße müsste noch hinter der Instanz des Objekts erst einmal das (array-)Member kommen. Wenn ich auf die Deklaration schaue, kann ich nichts besonderes erkennen:

    template<typename _Ty, size_t _Size>
    class array
    {
    public:
         _Ty _Elems[_Size == 0 ? 1 : _Size];
    }
    

    VS hat für den Debugger 'Visualizer' die es ermöglichen objekte zu beschreiben und anders darzustellen. In diesem Fall liegt wohl ein Visualizer vor der es als array darstellt. siehe %VSDIR%\Common7\Packages\Debugger\autoexp.dat



  • evilissimo schrieb:

    VS hat für den Debugger 'Visualizer' die es ermöglichen objekte zu beschreiben und anders darzustellen. In diesem Fall liegt wohl ein Visualizer vor der es als array darstellt. siehe %VSDIR%\Common7\Packages\Debugger\autoexp.dat

    Achso ... es ist ja nicht so, dass ich es hätte verwenden wollen, aber interessiert hatte es mich dennoch mal, danke.


Log in to reply