Pregunta

Me gustaría utilizar la siguiente expresión, que creo que no es estándar.He funciones que devuelven vectores de tomar ventaja de Valor de Retorno de Optimización:

vector<T> some_func()
{
    ...
    return vector<T>( /* something */ );
}

Entonces, me gustaría usar

vector<T>& some_reference;
std::swap(some_reference, some_func());

pero some_func no devolver un LValue.El código anterior tiene sentido, y me encontré con este modismo muy útil.Sin embargo, no es estándar.VC8 sólo emite una advertencia en el más alto nivel de advertencia, pero sospecho que otros compiladores pueden rechazarlo.

Mi pregunta es:Hay alguna manera para lograr la misma cosa que yo quiero hacer (es decir.construcción de un vector, asignar a otro, y destruir el viejo) que es compatible (y no utilizar el operador de asignación, vea abajo) ?

Para las clases I a escribir, por lo general implementar la asignación como

class T
{
    T(T const&);
    void swap(T&);
    T& operator=(T x) { this->swap(x); return *this; }
};

que se aprovecha de la copia de elisión, y solucionó mi problema.Para los tipos estándar, sin embargo, me gustaría usar swap ya no quiero un inútil copia de la temporal.

Y ya que debo usar VC8 y producir estándar de C++, no quiero oír hablar de C++0x y su r-value referencias.

EDITAR:Finalmente, se me ocurrió

typedef <typename T>
void assign(T &x, T y)
{
    std::swap(x, y);
}

cuando yo uso lvalues, ya que el compilador es gratuito para optimizar la llamada al constructor de copia y si es temporal, y vaya con std::swap cuando he lvalues.Todas las clases que uso son "necesarios" para implementar un no-estúpido versión de std::swap.

¿Fue útil?

Solución

Desde std::vector es un tipo de clase y las funciones miembro puede ser llamado en rvalues:

some_func().swap(some_reference);

Otros consejos

Si usted no desea inútil copias de empleos temporales, no la devuelve por valor.Uso compartido de los punteros, pasar los argumentos de la función por referencia a rellenar, insertar iteradores, ....

Hay una razón específica de por qué usted quiere volver por valor?

La única manera que conozco - dentro de las limitaciones de la norma - para lograr lo que quieres son para aplicar la la expresión de plantillas metaprogramación técnica: http://en.wikipedia.org/wiki/Expression_templates Lo que podría o no ser fácil en su caso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top