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;