2016-11-20 2 views
-1
  1. Оператор присваивания в C++ (например, x = 5) возвращает значение, помимо копирования этого значения в переменную. Каково значение, возвращаемое (то есть, что является результатом) оператора присваивания?
+4

Хмм, не ваш вопрос содержит ответ? Оператор присваивания возвращает назначенное значение (для встроенных типов, для пользовательских типов он возвращает то, что определено пользователем ...) – Hcorg

ответ

0

В соответствии со стандартом C++ (5.18 Назначение и назначение составного оператора)

1 Оператор присваивания (=) и операторы присваивания составных все группы справа налево. Все они требуют модусов фи способное именующее выражения, как их левых операнда и возвращает именующее выражение со ссылкой на левый операнд

и

2 В простом присваивании (=), то значение выражения заменяют что объекта, на который ссылается левый операнд.

Таким образом, если вам следующий фрагмент кода

int x; 
x = 5; 

то х получить значение 5 и выражение присваивания возвращает lvalue х. Это позволяет объединить оператор присваивания, например, следующим образом

(x = 5) += y; 

, потому что выражение x = 5 возвращает Lvalue из x.

В C этот код будет недействительным, поскольку в C выражение присваивания возвращает rvalue.

1

В C++ встроенный оператор назначения копирования вырабатывает выражение lvalue, которому может быть присвоено. Эффективно, как будто он был объявлен с результатом ссылочного типа.

Пользовательский оператор присваивания копий для типа класса может иметь любой тип возврата, включая (который ИМО был бы идеальным) void.

Однако, если класс должен использоваться как тип элемента стандартного контейнера, тогда он подчиняется требованиям стандартной библиотеки, а затем оператор присваивания экземпляра класса должен возвращать ссылку на назначенный объект.

C++ 11 §17.6.3.1/2 (utility.arg.requirements/2), таблицы 22 и 23 (от N3290):

enter image description here


Чтобы объявить оператор присваивания копии удаленным или дефолтным, он должен вернуть ссылку на тип назначенного объекта, например

struct S 
{ 
    auto operator=(S const&) -> S& = delete; 
}; 

определенного пользователем оператора копирующего присваивания может быть определен только для типа класса, а не для перечислимого типа, потому что это необходимо, чтобы быть не статической функцией-члена.

Смежные вопросы