2013-08-29 8 views
8

Come regola generale, decltype conserva constness:Perché decltype rimuove const dai tipi restituiti per i tipi predefiniti?

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 

Ma per i tipi di const di ritorno che restituiscono tipi fondamentali, decltype sembra gettare const via:

const int makeCI();   // factory 

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

Perché decltype scarto costanza in questo caso ? Intendo la domanda in due modi:

  1. Quale parte dello standard specifica questo comportamento?
  2. Qual è la motivazione per specificare il comportamento in questo modo?

Grazie.

+2

Perché mai vorresti ritorno per valore const? –

+0

@BillyONeal: una buona domanda, ma ciò non invalida questo. –

+0

@NicolBolas: non ho mai affermato di averlo fatto. –

risposta

16

Il comportamento osservato è corretto: decltype(makeCI()) è int, non int const.

L'espressione di chiamata di funzione makeCI() è un'espressione di valore. Per C++ 11 §3.10 [basic.lval]/4:

I valori di classe possono avere tipi qualificati per CV; i valori prerequisiti non di classe hanno sempre tipi cv-non qualificati.

Il termine "qualifica CV" si riferisce alla qualifica costante e costante. int non è un tipo di classe, quindi il tipo di espressione rvalore makeCI() è int e non è const-qualificato.

(Nelle bozze recenti dello standard di linguaggio C++, ad esempio N3690, questo testo è stato rimosso e sostituito da nuovo testo in §5 [expr]/6, che indica "Se un valore iniziale ha inizialmente il tipo" cv T , "dove T è un cv non qualificato, non di tipo array, il tipo di espressione è regolato su T prima di qualsiasi ulteriore analisi." Vedi CWG defect 1261 per i dettagli.)

+0

Ho davvero bisogno di prestare più attenzione, penso. +1. –

+0

Grazie per il puntatore alla parte dello standard che risponde a questa domanda. Qualche idea sulla motivazione? – KnowItAllWannabe

+0

Non conosco la cronologia di questa regola. Questa regola è presente in C++ 98. Nella maggior parte dei casi, non importa. (Ad esempio, la maggior parte delle operazioni built-in richiedono un lvalue modificabile in cui si verifica la modifica, quindi la qualifica costante delle espressioni rvalue non ha importanza.) –

Problemi correlati