Я хотел бы использовать следующую идиому, которую я считаю нестандартной.У меня есть функции, которые возвращают векторы с использованием функции оптимизации возвращаемого значения:
vector<T> some_func()
{
...
return vector<T>( /* something */ );
}
Затем я хотел бы использовать
vector<T>& some_reference;
std::swap(some_reference, some_func());
, но some_func
не возвращает значение LValue.Приведенный выше код имеет смысл, и я нашел эту идиому очень полезной.Однако это нестандартно.VC8 только выдает предупреждение на самом высоком уровне предупреждения, но я подозреваю, что другие компиляторы могут отклонить его.
Мой вопрос : есть ли способ достичь того же, что я хочу сделать(т.е. создать вектор, присвоить другому и уничтожить старый), который соответствует (и не использует оператор присваивания, см. ниже)?
Для классов, которые я пишу, я обычно реализую присваивание как
class T
{
T(T const&);
void swap(T&);
T& operator=(T x) { this->swap(x); return *this; }
};
, который использует преимущество копирования и решает мою проблему.Однако для стандартных типов я действительно хотел бы использовать swap
, так как я не хочу бесполезную копию временного.
И поскольку я должен использовать VC8 и производить стандартный C ++, я не хочууслышать о C ++ 0x и его ссылочных значениях.
РЕДАКТИРОВАТЬ: Наконец, я пришел к
typedef <typename T>
void assign(T &x, T y)
{
std::swap(x, y);
}
, когда я использую lvalues, так как компилятор может оптимизировать вызов кСкопируйте конструктор, если y временный, и добавьте std::swap
, когда у меня есть lvalues.Все классы, которые я использую, «необходимы» для реализации не глупой версии std::swap
.