Nous voudrions avoir une propre définition de std::runtime_error:runtime_error(const string& arg)
. Nous mettons en œuvre ce constructeur en termes de l'autre constructeur, à savoir, std::runtime_error:runtime_error(const char*)
, comme:gcc 4.9.1 n'est pas conforme aux normes? (std :: runtime_error)
namespace std {
runtime_error::runtime_error(const string& arg)
: runtime_error(arg.c_str()) {
...
}
}
Avec gcc-4.9.1, cela est impossible, puisque le constructeur std::runtime_error::runtime_error(const string& arg)
n'existe pas. Dans gcc/4.9.1/include/C++/4.9.1/stdexcept, nous voyons ce qui suit:
...
class runtime_error : public exception
{
string _M_msg;
public:
/** Takes a character string describing the error. */
explicit
runtime_error(const string& __arg);
virtual ~runtime_error() _GLIBCXX_USE_NOEXCEPT;
/** Returns a C-style character string describing the general cause of
* the current error (the same string passed to the ctor). */
virtual const char*
what() const _GLIBCXX_USE_NOEXCEPT;
};
...
La norme indique clairement qu'il devrait y avoir un constructeur runtime_error(const char*)
explicite.
19.2.6 Classe runtime_error [runtime.error]
namespace std {
class runtime_error : public exception {
public:
explicit runtime_error(const string& what_arg);
explicit runtime_error(const char* what_arg);
};
"* Nous implémentons un tel constructeur en termes de l'autre constructeur *" Pourquoi voudriez-vous? Celui qui prend un 'std :: string' a une longueur intégrée, alors que l'autre doit faire un' strlen' pour calculer la longueur. C'est juste une perte de temps inutile. En outre, vous n'êtes pas autorisé à réécrire des classes dans la bibliothèque standard. –
Utilisez-vous '-std = C++ 11'? –
@FredLarson Devrait être la valeur par défaut. –