Wenn Sie wirklich wollen, können Sie es nicht mit C++ 11 kompilieren machen:
class A {
template <typename T>
void operator=(T&&) && = delete; // no op= for rvalues
// generate other special members normally
A() = default;
A(A const&) = default;
A(A&&) = default;
~A() = default;
// op= only for lvalues
A& operator=(A&&) & = default;
A& operator=(A const&) & = default;
};
int main() {
A() = A(); // error
return 0;
}
(live example)
Notiere die am Ende &
und &&
(aka ref-Qualifier) von die Erklärungen der verschiedenen operator=
Formulare. Dadurch werden diese Deklarationen für lvalues bzw. rvalues ausgewählt. Wenn die rvalue-Version jedoch durch Überladungsauflösung ausgewählt wird, wird das Programm schlecht dargestellt, da es gelöscht wird.
Der standardmäßig generierte Operator = hat jedoch kein ref-Qualifikationsmerkmal, dh er kann sowohl für lvalues als auch für rvalues aufgerufen werden; deshalb kompiliert der Code in der Frage, obwohl A()
ein rvalue ist.
ist dies nicht mit A (A())? – stardust
ist es nicht Kopierinitialisierung? – stardust
@Named seinen Aufruf 'operator =' auf A –