web-dev-qa-db-fra.com

C ++ 11 - static_assert dans la fonction constexpr?

Comment ferait-on correctement un static_assert dans une fonction constexpr? Par exemple:

constexpr int do_something(int x)
{
  static_assert(x > 0, "x must be > 0");
  return x + 5;
}

Ce n'est pas du code C++ 11 valide, car une fonction constexpr ne doit contenir qu'une instruction return. Je ne pense pas que la norme ait une exception à cela, bien que le GCC 4.7 ne me permette pas de compiler ce code.

54
RétroX

Ce n'est pas du code C++ 11 valide, car une fonction constexpr ne doit contenir qu'une instruction return.

Ceci est une erreur. static_assert dans une fonction constexpr sont très bien. Ce qui est pas bien, c'est d'utiliser des paramètres de fonction dans des expressions constantes, comme vous le faites.

Vous pourriez lancer si x <= 0. L'appel de la fonction dans un contexte qui nécessite une expression constante échouera alors à la compilation

constexpr int do_something(int x) {
  return x > 0 ? (x + 5) : (throw std::logic_error("x must be > 0"));
}
59

Cela fonctionne et est un code C++ 11 valide, car les arguments de modèle sont uniquement à la compilation:

template <int x>
constexpr int do_something() {
    static_assert(x > 0, "x must be > 0");
    return x + 5;
}

J'ai été confronté aux mêmes problèmes que vous avez rencontrés avec les expressions constantes en C++. Il y a peu de documentation claire sur constexprs pour le moment. Et notez qu'il y a des bogues connus dans le suivi des problèmes de gcc, mais votre problème ne semble pas être un bogue.

Notez que si vous déclarez des fonctions constexpr à l'intérieur des classes, vous ne pouvez pas les utiliser à l'intérieur de la classe. Cela ne semble pas non plus être un bug.

Edit: Ceci est autorisé selon la norme: 7.1.3 états

... ou une instruction composée qui ne contient que

  • déclarations nulles,
  • static_assert - déclarations
  • déclarations typedef et alias-déclarations qui ne
    définir des classes ou des énumérations,
  • using-declarations,
  • directives d'utilisation,
  • et exactement une déclaration de retour
23
cppist