2015-10-22 1 views
-1

La méthode de test de la classe suivante n'a pas l'effet attendu. Je soupçonne que cela a quelque chose à voir avec le fait que l'invocation d'emplace_back invalide en quelque sorte la référence obtenue par l'indice.Affectation d'un élément vectoriel au résultat de la fonction qui appelle emplace_back?

De toute façon j'attendre la deuxième impression en test pour aboutir à

v[0] = 1 

cependant donner lieu à l'

v[0] = 5 

suggérant que la cession ne se fait pas.

class FooBar { 
    vector<size_t> v; 
public: 
    size_t add(size_t x) { 
     cout << "add(" << x << ")" << endl; 
     size_t K(v.size()); 
     v.emplace_back(x); 
     return K; 
    } 

    void test(size_t idx) { 
     cout << "v[" << idx << "] = " << v[idx] << endl; 
     v[idx] = add(0); 
     cout << "v[" << idx << "] = " << v[idx]<< endl; 
    } 
}; 

int main(int argc, char* argv[]) 
{  
    FooBar f; 
    f.add(5); 
    f.test(0); 
} 

Je sais que je peux contourner le problème en créant un temporaire pour stocker le résultat d'ajouter, puis effectuer la mission mais je suis intéressé à pourquoi je ne peux pas utiliser juste une affectation droite et pourquoi je ne suis pas obtenir n'importe quel type d'erreur en essayant d'effectuer ceci.

Compilé et testé avec MSVC (Visual Studio 2015).

+0

utilisation 'at' de savoir ce qui va mal – Anwesha

Répondre

3

La ligne

v[idx] = add(0); 

est la cause d'un comportement non défini. Vous modifiez le contenu de v dans add en supposant que v[idx] sera valide.

Pour un comportement prévisible, vous pouvez utiliser:

void test(size_t idx) { 
    cout << "v[" << idx << "] = " << v[idx] << endl; 
    size_t val = add(0); 
    v[idx] = val; 
    cout << "v[" << idx << "] = " << v[idx]<< endl; 
}