C++11 default-Implementation kombinierter Operatoren



  • Hallo,

    C++11 führt ja für Konstruktor, Destruktor und co. die neuen Schlüsselworte default und delete ein.
    Jetzt habe ich mal folgendes probiert:

    #include <iostream>
    
    class num
    {
    private:
        int value_;
    
    public:
        num() = default;
        explicit num(int n) : value_(n) {}
        num(num const &) = default;
        ~num() = default;
    
        num & operator = (num const &) = default;
    
        num operator + (num const & rhs) const
        {
            return num(value_ + rhs.value_);
        }
    
        num & operator += (num const &) = default;
    
        friend std::ostream & operator << (std::ostream &, num const &);
    };
    
    std::ostream & operator << (std::ostream & os, num const & n)
    {
        return (os << n.value_);
    }
    
    int main()
    {
        num answer(23);
        answer += 19;
        std::cout << "The answer is " << answer << std::endl;
    }
    

    Hier beschwert sich g++ 4.7, dass operator += nicht vorgegeben werden kann.
    Ich hätte mir in diesem Fall vorgestellt, dass der Compiler den kombinierten Operator durch operator + und operator = selbst bauen kann.
    Da ich explicit "default" angebe, hätte ich das für plausibel gehalten...

    Jetzt ist meine Frage: Was sagt der Standard dazu?



  • Nur special member functions (Default-Konstruktor, Copy/Move-Konstruktor, Copy/Move-Zuweisungsoperator, Destruktor) können defaultet werden. Halt auch nur die, die der Compiler normalerweise selbst generieren kann.



  • Das ist schade.



  • DrakoXP schrieb:

    C++11 führt ja für Konstruktor, Destruktor und co. die neuen Schlüsselworte default und delete ein.

    Diese Schlüsselwörter sind nicht neu. 🙂

    DrakoXP schrieb:

    Jetzt ist meine Frage: Was sagt der Standard dazu?

    Das wurde ja schon beantwortet. Das, was Du machen willst, bekommst Du per CRTP (curiously recurring template pattern). Siehe Boost.Operators. Da gab's hier doch auch einen Artikel dazu.



  • krümelkacker schrieb:

    DrakoXP schrieb:

    C++11 führt ja für Konstruktor, Destruktor und co. die neuen Schlüsselworte default und delete ein.

    Diese Schlüsselwörter sind nicht neu. 🙂

    In diesem Kontext schon.


Anmelden zum Antworten