2012-08-15 47 views
10

Gibt C++ 11 irgendwelche Garantien über inline Funktionen oder Methoden, wenn sie Aufrufe an andere Funktionen vornehmen, die mit dem noexcept Qualifier deklariert sind?C++ 11 noexcept Qualifier und Inline-Methoden

class My_String { ... 

    const char * c_str() const noexcept; 
    inline operator const char *() const { return c_str(); } 
}; 

Ich gehe davon ein optimierende Compiler frei sein würde, die Inline-Methode ohne Voll EH und Stack Abwickeln, gemäß der noexcept Qualifikation zu implementieren. Ich würde auch dies für eine einfache Zugriffsmethode erwarten zu:

... inline operator const char *() const { return m_buffer; } 

Während dieses Beispiel trivial aussieht, Ausnahme Angelegenheit garantiert, wenn verwendet, um andere Klassen oder Funktionen zu implementieren. F: Behandelt der C++ 11-Standard dies oder sollten Inline-Methoden mit noexcept gekennzeichnet werden? Oder ist es besser noexcept wegzulassen, außer erforderlich, um eine Klassen- oder Funktionsspezifikation zu erfüllen?

Bearbeiten: Um einige Verwirrung zu vermeiden: Ist noexcept implizit für die Inline-Methode?

+1

Für den Benutzer bereitgestellten Code ist 'noexcept' nur implizit für Destruktoren, als eine einfache Antwort. –

+2

eine Folgefrage ist: ** sollte man 'noexcept' wann immer möglich erklären? ** – Walter

Antwort

8

Entschuldigung, nein. Die einzigen impliziten Ausnahme-Spezifikationen sind

  • Auf Destruktoren.
  • Auf anderen implizit deklarierten oder explizit voreingestellten speziellen Memberfunktionen: Standardkonstruktoren, Konstruktoren kopieren und verschieben und Zuweisungen kopieren und verschieben, wenn sie nicht in einer Klassendefinition deklariert oder mit = default; deklariert sind.
  • Bei Freigabe-Funktionen: operator delete und operator delete[].

Also mit beiden Beispiel-Deklaration muss noexcept(static_cast<const char*>(std::declval<const MyString>()))false sein. Gehen Sie voran und schreiben Sie noexcept, wo es wichtig sein könnte.

Wie Sie bereits angemerkt haben, darf eine Compiler-Optimierung immer noch bemerken, dass eine Inline-Funktion keine Ausnahmen auslösen und die Ausnahmebehandlung im Aufrufer vereinfachen kann.

+1

In der Liste von * implizit' noexcept' * fehlt Ihnen, dass Destruktoren, die deklariert/definiert sind, implizit 'noexcept' sind, es sei denn die Der Benutzer hat eine andere Ausnahmespezifikation angegeben. Dies ist eine Abweichung von C++ 11 von C++ 03 Verhalten. Das heißt, ein Benutzer deklarierte den Destruktor wie 'T :: ~ T() {throw 1; } 'wird das Programm beenden, auch wenn keine andere Ausnahme aktiv ist (beachten Sie die fehlende Ausnahmespezifikation) –

+0

Ich habe das beim Scannen des Standards vermisst, danke. – aschepler

+1

Auch in der ursprünglichen Antwort verpasst: explizit voreingestellte spezielle Mitglieder handeln genauso, als ob sie implizit deklariert wären. – aschepler