vector <T>:: своп и временный объект - PullRequest
8 голосов
/ 15 января 2012

Код идет ниже:

#include <vector>

int main()
{
    vector<int> v1(5,1);
    v1.swap(vector<int> ());  //try to swap v1 with a temporary vector object
}

Приведенный выше код не может быть скомпилирован, ошибка:

error: no matching function for call to ‘std::vector<int, std::allocator<int> >::swap(std::vector<int, std::allocator<int> >)’

Но, если я изменю код на что-то вроде этого, он может скомпилироваться:

int main()
{
    vector<int> v1(5,1);
    vector<int> ().swap(v1);
}

Почему?

Ответы [ 2 ]

9 голосов
/ 15 января 2012

Поскольку vector<int>() является r-значением (временным, грубо говоря), и вы не можете привязать ссылку не-const к r-значению. Таким образом, в этом случае вы не можете передать его в функцию, не ссылающуюся на const.

Однако вполне нормально вызывать функции-члены для временных переменных, поэтому ваш второй пример компилируется.

6 голосов
/ 15 января 2012

Вызов v1.swap(std::vector<int>()) пытается привязать временную (т.е. std::vector<int>()) к неконстантной ссылке. Это незаконно и не удается. С другой стороны, использование std::vector<int>().swap(v1) вызывает неконстантную функцию для временного [неконстантного], что разрешено.

В C ++ 2011 я бы подумал, что объявление будет изменено на std::vector<T>::swap(T&&), и, таким образом, будет нормально использовать swap() с временными файлами (но, очевидно, все еще не с const объектами). Как указал GMan, это не так.

...