Warnung: discarding return value of function with 'nodiscard' attribute



  • Hallo zusammen.

    Es geht um die im Titel genannte Warnung. Im Grunde genommen weiß ich was mir die Warnung sagen will.
    Wenn ich eine Funktion verwende die mit dem nodiscard attribut versehen ist, und werte deren Rückgabewert nicht aus erhalte ich besagte Warnung.

    Aber nun zu meinem Beispiel:

    #include <iostream>
    #include <memory>
    
    class input
    {
         double _value;
    public:
    
        explicit input(const double value) :_value(value) {  }
    
        _declspec(property (get = getValue, put = setValue)) double Value;
        double getValue() const {return _value;}
        void setValue(const double value) {_value = value;}
    };
    
    int main()
    {
        auto input1 = std::make_shared<input>(input(10));
        auto input2 = std::make_shared<input>(input(5));
    
        input1->Value += input2->Value;
        
        std::cout << "input1->Value " << input1->Value; 
    }
    

    Die Warnung erhalte ich in der Zeile 21
    Der Pfeil Operator ist mit dem nodiscard attribut versehen.

    Es muss mit der _declspec property zusammenhängen.
    Mache ich mein _value public und greife direkt drauf zu bekomme ich keine Warnung.

    An welcher Stelle muss ich denn den Rückgabewert abfangen bzw auswerten?



  • @booster sagte in Warnung: discarding return value of function with 'nodiscard' attribute:

    Es muss mit der _declspec property zusammenhängen.

    AFAIK hat C++ keine properties. Ist dann wohl eine MS Erweiterung.



  • @booster sagte in Warnung: discarding return value of function with 'nodiscard' attribute:

    input1->Value += input2->Value;
    

    Ich denke, das liegt eher an dem += (weil gleichzeitig der Ausdruck input1->Value gelesen und geschrieben wird).
    Gibt denn auch

    input1->Value = input1->Value + input2->Value;
    

    diese Warnung?
    Bzw.

    auto x = input1->Value += input2->Value;
    


  • das hängt natürlich zusammen and der _declspec property (ja ist eine MS Erweiterung) und an dem +=

    auto x = input1->Value += input2->Value;
    

    geht nicht. Du meinst sicher:

    auto x = input1->Value + input2->Value;
    

    aber das liefert keine Warnung

    aber wenn ich statt dem _declspec property den _value public setze und diesen direkt verwende gibt es auch keine Warnung.

    input1->_value += input2->_value;
    

    das heißt die Kombination aus += und declspec Property beschert mir die Warnung.



  • In dem gezeigten Beispiel ist das Property auch nutzlos, da kann man den member auch direkt public machen.

    Wiso willst du unbedingt diese Property extension verwenden? Dadurch ist der code nicht portabel (Falls das überhaupt von relevanz ist)



  • Natürlich in dem Beispiel nicht. Ich habe es so runter gebrochen und den Code nur auf die Warnung reduziert.
    Also die property wird benötigt.



  • Und für was, wenn man fragen darf?



  • Da ich in der set_value Funktion eine Konvertierung vornehmen muss.

    Und da es in diesem Thread darum geht wieso ich eine Warnung bekomme.



  • @booster: Du hast meine Frage noch nicht vollständig beantwortet (bzgl. input1->Value = input1->Value + input2->Value;). Und welche Fehlermeldung erhältst du bei auto x = input1->Value += input2->Value; (denn dies sollte funktionieren, wie es bei einer public-Variablen ja auch kompiliert)?

    Evtl. solltest du einen Bug-Report bei MS stellen.



  • input1->Value = input1->Value + input2->Value;
    

    liefert keine Warnung

    auto x = input1->Value += input2->Value;
    

    liefert die Fehlermeldung:

    Error C3313 'x': variable cannot have the type 'void'



  • Sieht für mich nach einem Compiler-Bug aus.
    Ich sehe auf jeden Fall keinen Grund warum hier eine Warnung kommen sollte.



  • Der Compiler erzeugt ja aus dem Property den setValue()-Aufruf.

    Nur aus Interesse: was passiert, wenn du diese Funktion so implementierst:

    double setValue(double value) { _value = value; return value; }
    

    ?
    Kommt dann bei auto x = input1->Value += input2->Value; immer noch diese Fehlermeldung?



  • so würde es gehen ohne Fehlermeldung

    _declspec(property (get = getValue, put = setValue)) double Value;
    double getValue() const {return _value;}
    //void setValue(const double value) {_value = value;}
    double setValue(double value) { _value = value; return value; }
    

    wenn ich "get" nicht implementiere kommt eine Fehlermeldung

    _declspec(property (/*get = getValue,*/ put = setValue)) double Value;
    // double getValue() const {return _value;}
    //void setValue(const double value) {_value = value;}
    double setValue(double value) { _value = value; return value; }
    

    Error C2775 'input::Value': no 'get' method is associated with this property