2017-10-11 6 views
4

Retour au développement C++ après un hiatus de 12 ans. J'utilise le logiciel CLion de JetBrains, ce qui est génial car il fournit beaucoup d'informations sur les problèmes possibles de ma conception de classe. L'un des avertissements que j'obtiens dans la déclaration de lancement de constructeur de ma classe est: Thrown exception type is not nothrow copy constructible. Voici un exemple de code qui génère cet avertissement:Gestion "Le type d'exception levée n'est pas nothrow copy constructible" Avertissement

#include <exception> 
#include <iostream> 

using std::invalid_argument; 
using std::string; 

class MyClass { 
    public: 
     explicit MyClass(string value) throw (invalid_argument); 
    private: 
     string value; 
}; 

MyClass::MyClass(string value) throw (invalid_argument) { 
    if (value.length() == 0) { 
     throw invalid_argument("YOLO!"); // Warning is here. 
    } 

    this->value = value; 
} 

Cette pièce de code compile et je peux la tester unitaire. Mais je voudrais vraiment beaucoup me débarrasser de cet avertissement (afin de comprendre ce que je fais de mal, même s'il compile).

Merci

+1

Pourquoi utilisez-vous les spécifications de lancer? Ils ont été obsolète. https://stackoverflow.com/questions/13841559/deprecated-throw-list-in-c11 –

+1

Les spécificateurs lanceurs de douleur apportent. Beaucoup de douleur. Mieux vaut sans, vous êtes. – user4581301

Répondre

1

Le commentaire fourni par Neil est valide. En C++ 11, l'utilisation de throw dans une signature de fonction a été abandonnée au profit de noexcept. Dans ce cas, la signature de mon constructeur aurait dû être:

explicit MyClass(string value) noexcept(false); 

Mais, depuis noexcept(false) est appliqué par défaut à toutes les fonctions, à moins noexcept ou noexcept(true) est spécifié, je peux simplement utiliser:

explicit MyClass(string value); 

Going Retour à la façon de corriger l'avertissement "Thrown type d'exception n'est pas nothrow copy constructible", j'ai trouvé this post qui explique très bien ce que le problème est et comment le résoudre