2014-05-08 3 views
6

Uso Visual Studio 2013 Express.Il compilatore non si lamenta quando il vettore <char> && è associato al vettore <char> e

class B{ 
public: 
    vector<char>& a; 
    int& b; 
    B(vector<char>& i,int& c) :a(i),b(c) {} 
}; 

int main(){ 
    int l=3; 
    vector<char> h; 
    shared_ptr<B> bb (new B(std::move(h),l)); 
    return 0; 
} 

Perché può essere accettato il codice? Quando ho cambiato l'argomento l a std :: mossa (l), il compilatore si lamenta "non in grado di convertire argomento 2 da 'int' a 'int &'".

+3

Questo è un bug. Fallisce con g ++ 4.9.0 e clang ++ 3.4. – kec

risposta

4

Questa è un'estensione di lingua disponibile nel compilatore Visual C++ ed esiste già da un po 'di tempo. L'estensione consente di associare un valore (tempoarario) a un riferimento non const e prolungare la durata del valore come se si stesse vincolando a un riferimento const. Se si attiva il livello di avviso 4 o si attiva esplicitamente l'avviso C4239, il compilatore avviserà l'utente ogni volta che viene utilizzata l'estensione.

La documentazione di C4239 include un esempio simile a ciò che è nella domanda.