2014-07-03 10 views
13
#include <vector> 

struct C 
{ 
    std::vector<int> v; 
    decltype(v.begin()) begin() { return v.begin(); } 
    decltype(v.end()) end() { return v.end(); } 
}; 

Clang ++ non ha alcun problema, ma MSVC 2013 dà il seguente errore:Perché Visual Studio 2013 ha problemi con questo decltype di questo membro della classe?

error C2228: left of '.begin' must have class/struct/union 
+5

Vedere http://stackoverflow.com/a/11235245/103167 per il motivo per cui questo stile di codifica è rotto in qualsiasi compilatore e si dovrebbe usare il tipo di ritorno trailing per 'decltype' sui membri di' this'. –

risposta

19

Questo è un known bug. Il compilatore accetterà il codice se invece si utilizza un tipo di ritorno finale.

struct C 
{ 
    std::vector<int> v; 
    auto begin() -> decltype(v.begin()) { return v.begin(); } 
    auto end() -> decltype(v.end()) { return v.end(); } 
}; 

Come il bug report dice, un altro lavoro intorno è quello di utilizzare:

struct C 
{ 
    std::vector<int> v; 
    decltype(std::declval<decltype(v)>().begin()) begin() { return v.begin(); } 
    decltype(std::declval<decltype(v)>().end()) end() { return v.end(); } 
}; 

Ma, come @BenVoigt sottolinea nei commenti, read this answer per il motivo per cui il tipo di ritorno finale dovrebbe essere l'opzione preferita.

+2

Che dire del tipo di ritorno finale, che la segnalazione del bug dice che funziona? 'auto begin() -> decltype (v.begin()) {return v.begin(); } 'Sembra molto più bello per me, se funziona correttamente –

+0

@BenVoigt Accordo, ha aggiornato la risposta. E grazie per aver collegato a quella risposta per litb, non ero a conoscenza di questa limitazione. – Praetorian

Problemi correlati