2016-12-23 1 views
1

Lors de l'utilisation du spécificateur automatique pour créer une variable qui est initialisée avec la valeur de retour de vector<bool>::back(), la variable possède un qualificatif de référence.Spécificateur auto VC++ prenant le qualificatif de référence pour le vecteur <bool> :: retour

int main() 
{ 
    bool b = true; 
    bool & j = b; 
    auto k = j; 
    k = false; // k is of int type. So, j and i are unaffected. 

    std::vector<bool> vec = { true }; 
    auto l = vec.back(); 
    vec.pop_back(); 
    l = false; // I get a debug assertion here. 
} 

La variable k a bool comme son type, mais la variable l a le type std::_Vb_reference<std::vector< bool, std::allocator<bool>>::_Alty >

Si j'utilise int au lieu de bool, spécificateur automatique fonctionne pour vecteur aussi bien.

Est-ce un bug dans VC++? J'utilise Microsoft Visual C++ 2013.

+1

'std :: vecteur < bool >' n'est pas un conteneur – Danh

Répondre

4

vector<bool> est une bête spéciale et pas vraiment un vecteur du tout. back ne renvoie pas de référence mais un objet proxy de référence spécial qui permet l'accès à des bits uniques dans le vecteur. Comme il s'agit d'un proxy, il peut faire d'autres choses que les références normales ne peuvent pas faire - comme vérifier si le bit référencé est toujours là. Cela arrive seulement dans une construction de débogage, cependant (j'espère). Votre problème est causé par le fait que l'objet proxy est copiable et la variable auto prend heureusement une copie du proxy de référence alors qu'une référence correcte serait supprimée par le compilateur et la variable serait une copie de la valeur référencée .