Pourquoi le C++11 constexpr de manière restrictive?

Comme vous le savez probablement, C++11 introduit le constexpr mot-clé.

C++11 introduit le mot-clé constexpr, qui permet à l'utilisateur de
garantir qu'une fonction ou le constructeur de l'objet est au moment de la compilation
constante.
[...]
Cela permet au compilateur de comprendre et de vérifier que [nom de la fonction] est un
constante de compilation.

Ma question est pourquoi il y a des restrictions sur la forme des fonctions qui peuvent être déclarés. Je comprends le désir de garantir que la fonction est pure, mais considérez ceci:

L'utilisation de constexpr sur une fonction impose certaines restrictions sur ce que les
cette fonction peut faire. Tout d'abord, la fonction doit avoir un non-retour void
type. Deuxièmement, le corps de la fonction ne peut pas déclarer de variables ou de définir de nouvelles
les types. Troisièmement, le corps ne peut contenir que des déclarations, null états
et une seule instruction de retour. Il doit exister des valeurs d'argument tels
que, d'après l'argument de substitution, à l'expression dans la déclaration
produit une expression constante.

Qui signifie que cette fonction pure est illégal:

constexpr int maybeInCppC1Y(int a, int b)
{
    if (a>0)
        return a+b;
    else
        return a-b;
  //can be written as   return  (a>0) ? (a+b):(a-b); but that isnt the point
}

Aussi, vous ne pouvez pas définir des variables locales... 🙁
Alors je me demandais est-ce une décision de conception, ou de faire des compilateurs de le sucer quand il s'agit de prouver l'existence de la fonction un est pur?

  • De nombreuses années plus tard, en c++14, je pense qu'il est compilable maintenant. (coliru.stacked-crooked.com/a/e84489e166f931b7) ou bien j'ai mal compris quelque chose? C'est un comportement indéfini?
  • c++14 assoupli les règles pour constexpr, mais cette question est à propos de C++11
InformationsquelleAutor NoSenseEtAl | 2011-11-29