Нет, тип возврата не имеет значения. †
Стандарт C ++ не накладывает никаких требований на тип возвращаемого значения для специальных функций-членов назначения копирования, которые вы объявляете сами. Это просто должен быть operator=()
, который принимает «ровно один параметр типа X
, X&
, const X&
, volatile X&
или const volatile X&
». †† Следовательно, void operator=( const NonCopyable& );
по-прежнему является оператором копирования (определенным пользователем, если быть точным).
Поскольку вы фактически указали свой собственный оператор назначения копирования, он будет превосходить генерацию оператора назначения копирования по умолчанию. Это приводит к тому, что все вызовы NonCopyable
оператора копирования присваиваются вашим, в результате чего любые попытки использовать оператор назначения копирования не компилируются, так как он объявлен private
.
class Foo : NonCopyable
{
};
int main()
{
Foo a;
Foo b;
// Compiler complains about `operator=(const NonCopyable&)`
// not accessible or something like that.
a = b;
}
И так как я никогда не смогу фактически использовать его, не имеет значения, что это не совсем канонический оператор назначения копирования. Если бы я попытался использовать оператор присваивания копии, это привело бы к ошибке компилятора, а это именно то, что вам нужно.
† Конечно, стилистически важно, действительно ли оператор присваивания копии что-то делает. Как правило, вы хотите, чтобы ваши операторы вели себя так же, как и встроенные, поэтому возвращение X&
является хорошей практикой, когда вы фактически выполняете присваивание.
†† C ++ Стандарт: 12.8 Копирование объектов класса [class.copy]
9 Объявленный пользователем copy оператор присваивания X::operator=
- это нестатическая не шаблонная функция-член класса X
с ровно одним
параметр типа X
, X&
, const X&
, volatile X&
или const
volatile X&
.