#include <vector>
using namespace std;
void f(const vector<int>&) {}
void f(vector<int>&&) {}
int main()
{
{
vector<int> coll;
//
// coll is dying, so,
// "f(coll)" will call "f(const vector<int>&)" or
// "f(vector<int>&&)" as per C++11?
//
f(coll);
}
}
Dans le code ci-dessus, coll
est en train de mourir; Ainsi, f(coll)
appellera f(const vector<int>&)
ou f(vector<int>&&)
selon C++ 11?Est-ce que C++ 11 garantit qu'un objet mourant sera déplacé plutôt que copié en tant qu'argument?
Non; dans ce cas, il appellera 'f (const std :: vector &)'. Dans l'appel que vous faites, 'coll' est une lvalue nommée. Le fait que 'coll' sera hors de portée dans la ligne suivante n'est pas pertinent. Si vous voulez appeler la version rvalue de 'foo', alors vous devriez utiliser' f (std :: move (coll)) '. –
Que voulez-vous dire _ "' 'coll' est en train de mourir" _? Il sera détruit après l'appel. Vous avez probablement signifié quelque chose comme 'foo (vecteur());' –
'coll' n'est pas" en train de mourir "(sortir de la portée) avant l'accolade'} '. Dans l'accolade, c'est parfaitement sain :-) Par conséquent, si vous voulez obtenir un rvalue vous avez besoin d'un explicite 'std :: move (coll)' – AndyG