2011-11-14 13 views
7

De acuerdo con el estándar de C++, ¿puedo estar seguro de que los operadores de asignación para las variables incorporadas regresan (el valor original)?¿Los operadores de asignación "son necesarios" para regresar?

¿O es esta implementación dependiente (sin embargo, simplemente tienen los compiladores más populares implementados esto)?

+0

No devuelven el * valor * anterior o el nuevo *. Devuelven la * variable * asignada a. – fredoverflow

Respuesta

9

Sí, se garantiza:

5,17 misiones y compuestos operadores de asignación

El operador de asignación (=) y los operadores de asignación compuestos todo grupo derecha a izquierda. Todos requieren un valor l modificable ya que su operando izquierdo y devuelve un valor l referente al operando izquierdo.

Esto se aplica a los tipos incorporados. Con los tipos definidos por el usuario, puede devolver cualquier cosa.

+0

¿a qué tipos se refiere esta sección? Seguramente, hay excepciones conocidas (no me sorprendería que existan dentro de la norma) – sehe

+0

Esto solo necesita un extracto de §13.6 (operadores incorporados) para ser exactos OMI: "Las funciones del operador candidato que representan la construcción en los operadores definidos en la Cláusula 5 se especifican en esta subcláusula ". La Nota en esa sección aclara que todas las restricciones en la sección 5 se aplican a los operadores incorporados. – Mat

-2

Sí. La semántica del operador simplemente no funcionará de otra manera.

+0

¿Podría hacer referencia a algún párrafo de la Norma para eso? – sharptooth

+0

Publicación editada para eliminar la basura extraña. – moshbear

+1

Esto ignora por completo la posibilidad de un 'T operator = perfectamente perfecto (const T &) const {T other =/* blabla * /; devolver T; } '- esto de hecho sucede mucho en los motores de plantilla de expresión. Por supuesto, los tipos de 'valor' no deberían sorprender a sus usuarios de esta manera, – sehe

3

De acuerdo con el estándar de C++, ¿puedo estar seguro de que los operadores de asignación para las variables de compilación regresen (el valor original)?

Editar Lo entiendo ahora, creo. Sí: puede estar seguro de que los tipos incorporados devuelven el valor original por referencia después de operator=, *=, /=, -=, +=, ^=, ~=, &= and |=.

"For build in variables" es un poco críptico para mí. Sin embargo,

X makeX() 
{ 
    return X(); 
} // must have accessible copy constructor 

// ... 
X x; 
x = makeX(); // ... _and_ assignment operator 

o esto es dependiente de la implementación

Debe no ser (edición ver referencia estándar por UncleBens)

+0

Su fragmento no usa el operador de asignación. – UncleBens

+0

@UncleBens: ah, error eterno. Se corrigió la muestra obsoleta :) Thx – sehe

0

Sí. Se garantiza que todas las asignaciones y asignaciones aumentadas en tipos predefinidos funcionan de esa manera.

Sin embargo, tenga en cuenta que las asignaciones de tipos definidas por el usuario o las asignaciones aumentadas pueden, por ejemplo, devolver void. Esta no es una buena práctica y no debería hacerse (aumenta el efecto sorpresa en los usuarios, no es algo bueno), pero es técnicamente posible, así que si está escribiendo, por ejemplo, una biblioteca de plantillas, no debe hacer esa suposición a menos que sea realmente importante para ti.

5

Depende de lo que quiere decir con "el valor original".

Por ejemplo:

#include <iostream> 
int main() { 
    int i; 
    std::cout << (i = 1.9) << "\n"; 
} 

impresiones 1.La expresión de asignación produce el nuevo valor del LHS (es decir, 1), no el "valor original" del RHS (1.9).

No estoy seguro de si eso es lo que quería preguntar.

Cuestiones relacionadas