Если вы действительно хотите, вы можете сделать это не компилируется с C++ 11:
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)
Обратите внимание на &
и &&
(он же реф-классификаторов) в конце декларации различных форм operator=
. Это позволяет отображать эти объявления для lvalues и rvalues соответственно. Тем не менее, версия rvalue, когда она выбрана с помощью разрешения перегрузки, приводит к плохому формированию программы, поскольку она удалена.
Порожденный по умолчанию оператор =, однако, не имеет никакого ref-определителя, то есть он может быть вызван как для lvalues, так и для rvalues; поэтому код в вопросе компилируется, хотя A()
является rvalue.
Это не использование A (A())? – stardust
не инициализация копирования? – stardust
@Named его вызов 'operator =' на A –