Interesujące! Nie zdawałem sobie nawet z tego sprawy i zabrałem mnie, aby go znaleźć (było to częścią propozycji "Extending move semantics to *this"). Zapis jest zdefiniowany w 8.3.5 [dcl.decl] pkt 4, na wypadek gdyby ktokolwiek chciał spojrzeć.
W każdym razie: Teraz, wiedząc o tej funkcji, wydaje się, że najbardziej użyteczne jest używanie jej do przeciążania i być może zachowywać się inaczej, jeśli obiekt, na który wywoływana jest funkcja, jest lwartością lub rwartością. Używanie go w celu ograniczenia tego, co można zrobić, np. Z wynikiem przypisania, wydaje się niepotrzebne, szczególnie jeśli obiekt faktycznie jest l-wartością. Na przykład, możesz chcieć składni powrót rvalue przypisywanie do rvalue:
struct T {
auto operator=(T&) & -> T&;
auto operator=(T&&) & -> T&;
auto operator=(T&) && -> T;
auto operator=(T&&) && -> T;
};
Zamiarem tutaj byłoby, aby umożliwić przejście od wyniku cesji (czy to warto, chociaż nie jestem na pewno: dlaczego nie pominąć zadania?). Nie sądzę, żebym użył tej funkcji przede wszystkim do ograniczenia zastosowań.
Osobiście lubię możliwość, że czasami zdobędę lwartość z wartości runtu, a operator przydziału jest często sposobem na zrobienie tego. Na przykład, jeśli chcesz przejść lwartością do funkcji, ale wiesz, że nie chcesz korzystać z niego nic, można użyć operatora przypisania zdobyć lwartością:
#include <vector>
void f(std::vector<int>&);
int main()
{
f(std::vector<int>() = std::vector<int>(10));
}
To może być nadużycie operatora przydziału, aby uzyskać lwartość z wartości r, ale jest mało prawdopodobne, aby stało się przez przypadek. W związku z tym nie zejdę mi z drogi i uniemożliwię to poprzez ograniczenie operatora przypisania do zastosowania tylko do l-wartości. Oczywiście, zwrot rinktu z zadania do rwartości również zapobiegłby temu. Które z tych dwóch zastosowań jest bardziej przydatne, jeśli w ogóle, może być brane pod uwagę.
BTW, clang wydaje się wspierać składnię cytowaną od wersji 2.9.
Jednym z powodów jest to, że większość kompilatorów nie obsługuje jeszcze składni. Innym jest to, że nie rozwiązuje * poważnego problemu *. Jak często to się dzieje przez pomyłkę? –
Myślę, że to się zdarza. 'if (somefunc() = value)' Oczywiście większość kompilatorów wysyła ostrzeżenie, ale nie we wszystkich przypadkach. –