Если мы примем, что фрагмент вашего коллеги является мудрым, потому что ClassTest стоит дорого для копирования, я бы предпочел:
using std::swap;
std::vector<ClassTest> vecClass1;
ClassTest ct1;
ct1.blah = blah // set some stuff
...
vecClass1.push_back(ClassTest());
swap(ct1, vecClass1.back());
Я думаю, что это понятнее и вполне может быть более безопасным для исключений. Код ...
предположительно распределяет ресурсы и, следовательно, может вызвать исключение (или что делает копирование полностью построенного ClassTest
столь дорогим?). Поэтому, если вектор действительно не является локальным для функции, я не думаю, что будет хорошей идеей, чтобы он был наполовину собран во время выполнения этого кода.
Конечно, это еще дороже, если ClassTest
имеет только стандартную реализацию swap
, но если ClassTest
не имеет эффективного swap
, то копировать его не стоит. Так что этот прием, возможно, следует использовать только с классами, которые известны как дружественные, а не с неизвестными типами параметров шаблона.
Как говорит Джин, std::move
в любом случае лучше, если у вас есть эта функция C ++ 0x.
Если мы беспокоимся о том, что ClassTest стоит дорого для копирования, то перемещение вектора - ужасающая перспектива. Таким образом, мы также должны либо:
- зарезервируйте достаточно места перед добавлением чего-либо,
- используйте
deque
вместо vector
.