Проходя временные как LValues - PullRequest
0 голосов
/ 08 июля 2010

Я хотел бы использовать следующую идиому, которую я считаю нестандартной.У меня есть функции, которые возвращают векторы с использованием функции оптимизации возвращаемого значения:

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.

Ответы [ 3 ]

1 голос
/ 09 июля 2010

Так как std::vector является типом класса и функции-члены могут вызываться по значениям:

some_func().swap(some_reference);
1 голос
/ 08 июля 2010

Если вам не нужны бесполезные копии временных файлов, не возвращайте по значению. Используйте (общие) указатели, передайте аргументы функции по ссылке для заполнения, вставьте итераторы, ....

Есть ли конкретная причина, по которой вы хотите вернуть по значению?

0 голосов
/ 08 июля 2010

Единственный способ, которым я знаю - в рамках ограничений стандарта - для достижения того, чего вы хотите, - это применить шаблоны выражений метод метапрограммирования: http://en.wikipedia.org/wiki/Expression_templates Что может быть или не быть простым в вашем случай.

...