Compiler Warnung C26447: Die Funktion ist als "noexcept" deklariert, aber ...



  • Hallo,

    mich würde interessieren, wie geht ihr mit dieser Warnung um? Folgendes Beispiel:

    #include <iostream>
    #include <string>
    
    std::string convert(const size_t value) noexcept
    {
    	return std::to_string(value);
    }
    
    signed main()
    {
    	const auto& str = convert(314);
    
    	std::cout << str.c_str() << std::endl;
    
    	return 0;
    }
    

    In Zeile 6 erscheint die Warnung, dass die Funktion std::to_string() unter Umständen eine Exception werfen kann, was durch den Konstruktur der std::string-Klasse verursacht wird. Die Wahrscheinlichkeit, dass die Exception tatsächlich geworfen wird halte ich für relativ gereing, sofern keine Nutzereingaben an die Funktion convert() übergeben werden.

    Ich habe jetzt zwei Möglichkeiten:

    1. Ich ignoriere die Warnung, was eigentlich nicht gemacht werden sollte. Denn wenn ich ein großes Projekt betrachte (mit 30, 40 oder mehr Klassen) dann komme ich mit dem Ignorieren der Warnungen nicht mehr hinterher - es ist schlichtweg nicht zu überblicken (u.U. gibt es auch noch andere Warnungen). Warnungen sollten aber nicht generell ignoriert werden, ergo habe ich hier ein Qualitätsproblem.

    2. Ich schalte diese Warnung über Visual Studio ab. Das wiederrum hat den Nachteil, dass ich vielleicht in einer Methode, die als noexcept deklariert ist, genau diese Stelle in meinem Code übersehe und mein Programm unkontrolliert abstürtzt.

    Von daher meine Frage von oben. Wie geht ihr mit dieser Warnung um?

    Vielen Dank

    VG Torsten



  • @TorDev Warnung ernstnehmen und nicht versuchen den Compiler zu belügen.



  • Du kannst bei jedem Compiler im Source-Code eine Warnung an- und abschalten.
    Z.B.:

      //---------------------------------------------------------------------------
      #if defined (_MSC_VER)
        #pragma warning( disable : xxxx ) // warning no
      #endif
      //---------------------------------------------------------------------------
      #if defined(__GNUC__)
        #pragma GCC diagnostic push
        #pragma GCC diagnostic ignored "xxxxx" //warning string
      #endif 
      //---------------------------------------------------------------------------
    	Your code
    	……
      //---------------------------------------------------------------------------
      #if defined (_MSC_VER)
        #pragma warning( default : xxxx ) // warning no
      #endif
      //---------------------------------------------------------------------------
      #if defined(__GNUC__)
        #pragma GCC diagnostic pop
      #endif 
      //---------------------------------------------------------------------------
    
    

    Aber nur in Ausnahmefällen; ansonsten gilt dass was @Tyrdal geschrieben hat.


  • Mod

    Funktionen noexcept zu deklarieren muss schon einen bestimmten Zweck haben. Einfach willkuerlich alles noexcept zu deklarieren, was nicht einen konkreten Fehlermodus durch Exceptions behandelt, ist es mMn. nicht wert.

    Ein konkreter Vorteil von noexcept ist bspw. in STL Containern zu finden: wenn ein move-ctor/assignment operator nicht noexcept markiert ist, wird ein Container mit starker exception guarantee nicht moven, weil bei einer Exception der Ursprungszustand des moved-from Objekts nicht wiederhergestellt werden kann. Siehe https://www.learncpp.com/cpp-tutorial/stdmove_if_noexcept/

    Ein anderer Vorteil liegt in potenziellen control flow Optimierungen, aber hier ist die potenzielle Performance-Marge fuer end user code sehr klein bzw. oftmals gleich Null. In high-performance Bibliotheken kann das einen Unterschied machen, aber dort sind sich die Autoren dann bewusst wo es hingehoert.



  • Vielen Dank für die schnellen Rückmeldungen,

    ich hatte es befürchtet. Es führt kein Weg daran vorbei, noch sauberer zu arbeiten, wenn meine Programme funktionieren sollen.

    Also vielen, vielen Dank nochmal an euch 🙂

    VG Torsten


Anmelden zum Antworten