Frage Warum entfernt declltype const von Rückgabetypen für integrierte Typen?


Generell, decltype bewahrt die Konstanz:

const int ci = 0;
decltype(ci)  x;         // x is const int
x = 5;                   // error--x is const

class Gadget{}:

const Gadget makeCG();         // factory

decltype(makeCG()) y1, y2;     // y1 and y2 are const Gadgets
y1 = y2;                       // error--y1 is const

Aber für const Rückgabetypen, die grundlegende Typen zurückgeben, decltype scheint zu werfen const Weg:

const int makeCI();            // factory

decltype(makeCI()) z;          // z is NOT const
z = 5;                         // okay

Warum tut decltype Konstanz in diesem Fall verwerfen? Ich meine die Frage auf zwei Arten:

  1. Welcher Teil des Standards spezifiziert dieses Verhalten?
  2. Was motiviert dieses Verhalten?

Vielen Dank.


8
2017-08-29 04:18


Ursprung


Antworten:


Das von Ihnen beobachtete Verhalten ist korrekt: decltype(makeCI()) ist intnicht int const.

Das makeCI() Funktionsaufruf-Ausdruck ist ein Prvalue-Ausdruck. Per C ++ 11 §3.10 [basic.lval] / 4:

Klassenprvalues ​​können cv-qualifizierte Typen haben; Nicht-Klasse Prvalues ​​haben immer cv-unqualifizierte Typen.

Der Begriff "cv-qualification" bezieht sich auf Const- und Volatile-Qualification. int ist kein Klassentyp, also der Typ des rvalue-Ausdrucks makeCI() ist int und es ist nicht const-qualifiziert.

(In neueren Entwürfen des C ++ - Sprachstandards, z. B. N3690, wurde dieser Text entfernt und durch neuen Text in §5 [expr] / 6 ersetzt, der besagt: "Wenn ein Pr-Wert anfänglich den Typ" cv T "hat, wobei T ist ein cv-unqualifizierter Nicht-Klassen-, Nicht-Array-Typ, der Typ des Ausdrucks wird vor jeder weiteren Analyse auf T eingestellt. "Siehe CWG-Defekt 1261 für Details.)


16
2017-08-29 04:57