sirven relacionales que programacion para operadores operador los logicos flecha asignacion aritmeticos c++ c++11 assignment-operator default-implementation

c++ - que - operadores relacionales



¿Qué significa un símbolo comercial después de este operador de asignación? (2)

Estaba leyendo esta buena respuesta con respecto a la "Regla de los cinco" y noté algo que no recuerdo haber visto antes:

class C { ... C& operator=(const C&) & = default; C& operator=(C&&) & = default; ... };

¿Cuál es el propósito del & carácter situado delante de = default para el operador de asignación de copia y para el operador de asignación de movimiento? ¿Alguien tiene una referencia para esto?


Es parte de una función que permite a las funciones miembro no estáticas de C ++ 11 diferenciar entre si se les llama a valores l o valores r.

En el caso anterior, el operador de asignación de copia predeterminado aquí solo puede invocarse en lvalues. Esto usa las reglas para los enlaces de referencia lvalue y rvalue que están bien establecidos; esto solo los establece para this .

En el caso anterior, el operador de asignación de copia está predeterminado solo si el objeto que se está copiando puede vincularse a una referencia de valor l no const. Entonces esto está bien:

C c{}; c = C{};

Esto no es:

C{} = c;

El temporal aquí no puede vincularse a una referencia lvalue, y por lo tanto no se puede llamar al operador de asignación de copia. Y dado que esta declaración impedirá la creación del operador habitual de asignación de copias, esta sintaxis evita de manera efectiva la asignación de copias (o la asignación de movimiento) a las temporarias . Para restaurar eso, necesitaría agregar una versión && :

C& operator=(const C&) && = default; C& operator=(C&&) && = default;


Significa que esa función solo se puede llamar en lvalues. Entonces esto fallará porque se llama a la función del operador de asignación en una expresión de objeto rvalue:

C() = x;