¡Interesante! Ni siquiera estaba al tanto de esto y me tomó un tiempo encontrarlo (era parte de la propuesta "Extending move semantics to *this"). La notación se define en 8.3.5 [dcl.decl] párrafo 4 en caso de que alguien quiera echar un vistazo.
De todos modos: ahora, conociendo esta característica, parece que es más útil usarlo para sobrecargar y posiblemente comportarse de manera diferente si el objeto al que se llama una función es un valor l o un valor r. Usarlo para restringir lo que se puede hacer, por ejemplo, con el resultado de una tarea parece innecesario, especialmente si el objeto realmente es un valor l. Por ejemplo, es posible que desee la sintaxis para devolver un valor de lado derecho de asignar a un valor p:
struct T {
auto operator=(T&) & -> T&;
auto operator=(T&&) & -> T&;
auto operator=(T&) && -> T;
auto operator=(T&&) && -> T;
};
La intención sería la de permitir que se mueve a partir del resultado de asignación (si es que vale la pena, sin embargo, no estoy seguro: ¿por qué no omitir la tarea en primer lugar?). No creo que use esta característica principalmente para restringir los usos.
Personalmente, me gusta la posibilidad de obtener a veces un lvalue de un valor r y el operador de asignación suele ser una forma de hacerlo. Por ejemplo, si usted necesita para pasar un valor-I a una función, pero usted sabe que no desea utilizar cualquier cosa con él, puede utilizar el operador de asignación hacerse con un valor-i:
#include <vector>
void f(std::vector<int>&);
int main()
{
f(std::vector<int>() = std::vector<int>(10));
}
Ésta puede ser una abuso del operador de asignación para obtener un lvalue de un valor r pero es poco probable que ocurra por accidente. Por lo tanto, no saldría de mi camino y lo haría imposible al restringir el operador de asignación para que sea aplicable solo a los valores l. Por supuesto, devolver un valor r de una asignación a un valor r también evitaría esto. Cuál de los dos usos es más útil, si lo hay, podría ser una consideración.
BTW, clang parece ser compatible con la sintaxis que citó desde la versión 2.9.
Una de las razones es que la mayoría de los compiladores no son compatibles con la sintaxis todavía. Otra es que no resuelve un problema * mayor *. ¿Con qué frecuencia sucede esto por error? –
Creo que sucede. 'if (somefunc() = value)' Por supuesto, la mayoría de los compiladores emiten una advertencia para esto, pero no en todos los casos. –