kann variable definition von non-literal type-in constexpr-Funktion Körper c++14?

Ich denke, dass in C++14 mehr restrictives entfernt von constexpr. Aber nach N3797 7.1.5 3-punct:


Die definition eines contexpr Funktion shal erfüllen die folgenden Einschränkungen:

  • es darf nicht sein, virtuelle
  • der Rückgabetyp ist ein literal-Typ;
  • jedem Ihrer Parameter-Typen wird ein literal-Typ;
  • seine Funktion-Körper werden = löschen, = Standard, oder ein compound-Anweisung, die nicht enthalten:
    • eine asm-definition,
    • eine springen Anweisung,
    • eine try-block, oder
    • die definition einer Variablen von nicht-wörtliche Art oder aus statischen oder thread Lagerung Dauer oder, für die ist keine Initialisierung
      durchgeführt.


Weiß ich, warum die statische, thread-und Speicher-Dauer-Variablen sind nicht erlaubt, aber ich sehe keinen Grund, warum NUR erlaubt die definition einer Variablen von literalen Typ ?

Oder ich bin nicht zu verstehen, die standard.

Ich bin mir nicht sicher, aber laut standard folgende Fehler erstellt werden soll, auch 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: Wenn wirklich über Fehler, die passieren würde, warum diese restrics nicht entfernt?

InformationsquelleAutor Khurshid | 2014-02-14

Schreibe einen Kommentar