почему const return prevent: (a1 = a2) = a3? - PullRequest
0 голосов
/ 29 мая 2020

Я не понимаю, почему добавление const к типу возвращаемого значения предотвращает (a1 = a2) = a3, как сказано в комментарии в строке 2.
Может кто-нибудь мне это объяснить?

// overloaded assignment operator;
// const return prevents: (a1 = a2) = a3
const Array& Array::operator=(const Array& right) {
    if (&right != this) { // avoid self-assignment
       // for Arrays of different sizes, deallocate original
       // left-side Array, then allocate new left-side Array
        if (size != right.size) {
            delete[] ptr; // release space
            size = right.size; // resize this object
            ptr = new int[size]; // create space for Array copy
        }

        for (size_t i{ 0 }; i < size; ++i) {
            ptr[i] = right.ptr[i]; // copy array into object
        }
    }

    return *this; // enables x = y = z, for example
}

1 Ответ

2 голосов
/ 29 мая 2020

При оценке выражения:

a1 = a2 = a3

группировка выполняется справа налево, поэтому выражение принимает следующий вид:

a1 = (a2 = a3)
//   ^^^^^^^^^ const, but evaluated first, so ok. 

Это нормально, поскольку выражение в скобках дает const значение, которое можно использовать в качестве аргумента для operator=.

Однако в выражении:

  (a1 = a2) = a3
//^^^^^^^^^ const, but evaluated first, so assigning to the result is not ok.

выражение в скобках снова дает значение const, но теперь вы пытаясь присвоить значение const, что невозможно.

...