peut avoir de définition de la variable de non-type de littéral à constexpr corps de la fonction c++14?

Je pense qu'en C++14 plus restrictives sont retirés de constexpr. Mais selon N3797 7.1.5 3-punct:


La définition d'un contexpr fonction shal satisfaire les contraintes suivantes:

  • il ne doit pas être virtuel
  • son type de retour est un type de littéral;
  • chacun de ses paramètres de types est un type de littéral;
  • son de la fonction-corps doit être = supprimer, = par défaut, ou un composé déclaration qui ne contient pas de:
    • un asm-définition,
    • un goto déclaration,
    • un essayez-bloc, ou
    • une définition d'une variable de non-littérale type ou de la statique ou de fil de stockage durée ou pour lesquels aucune initialisation
      effectuée.


Je sais pourquoi statique, fil de stockage de durée variables sont interdits, mais je ne vois pas de raison, pourquoi SEULEMENT permis la définition d'une variable de type de littéral ?

Ou je ne suis pas comprendre la norme.

Je ne suis pas sûr, mais selon les normes erreurs suivantes doivent être créés, même C++14:

struct point{
constexpr point(): x(0), y(0){}
constexpr point(int x_, int y_): x(x_),y(y_){}
constexpr int hypot()const { return x*x + y*y; }
int x,y;
};

constexpr int hypot(int x, int y) {  
   point p{x,y}; //error, because p - is not literal type.
   return p.hypot();
}

//error, because return type is not literal.
constexpr point  getPoint(int x, int y) { return {x,y}; }

//error, because parameter is not literal.
constexpr int hypot(point p) { return p.hypot(); }

Q: Si vraiment au-dessus des erreurs se passerait-il, pourquoi ces restrics ne sont pas supprimés?

OriginalL'auteur Khurshid | 2014-02-14