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
Du musst angemeldet sein, um einen Kommentar abzugeben.
literal-Typ definiert 3.9/10:
Damit Ihre struct
point
ist eine wörtliche Art und dein Beispiel-code ist gültiges C++1y.Warum
constexpr
Funktionen sind eingeschränkt, um die Variablen der Literale Typ, Sie sind die einzigen Typen, die sind garantiert interpretierbar zur compile-Zeit.InformationsquelleAutor Casey