Могу ли я присвоить возвращаемое значение оператора доступа члена? - PullRequest
0 голосов
/ 06 марта 2019

Я читал, что оператор точки доступа . и оператор стрелки -> возвращают значения:

Оператор стрелки требует операнд-указатель и возвращает значение l. Оператор точки выдает lvalue, если объект, из которого извлекается член, является lvalue; в противном случае результатом является значение.

Это из издания C ++ Primer 5.

Так что я представляю, что могу присвоить значение всякий раз, когда неконстантное lvalue является возвращением их выражения, например:

struct foo {
    int x_;
    const int y_ = 17; ;
    void bar() { cout << "bar()" << endl;}
}f, *pf;

pf = &f;

(pf->bar()) = 75; // error
cout << f.x_ << endl;
(f.bar()) = 12;// error
(f.x_) = 23;
cout << "f_x: " << f.x_ << endl;
(pf->y_) = 34;// error

Я запутался в присвоении возвращаемого значения оператора стрелки. Выше сказано, что -> всегда возвращает lvalue, но не получается, если я пытаюсь присвоить это значение.

  • Может кто-нибудь объяснить мне параграф выше из книги C ++. Спасибо.

Ответы [ 2 ]

4 голосов
/ 06 марта 2019

Выше сказано, что -> всегда возвращает lvalue, но не получается, если я пытаюсь присвоить это значение.

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

Итак, в

foo bar;
foo* f = &bar;
f->x_;
f->y_;

оба доступа к элементам дают выражение lvalue.В

foo f;
f.x_;
f.y_;

у вас снова есть lvalue, поскольку f является lvalue.Однако в

foo{}.x_;
foo{}.y_;

оба членских доступа являются значениями r, поскольку foo{} является значениями.

2 голосов
/ 06 марта 2019

Можно ли присвоить возвращаемое значение оператора доступа к члену?

Если левый операнд оператора является lvalue, и если элемент является присваиваемым и неконстантным, тогда да. В остальных случаях №

(pf->bar()) = 75; // error

Вы не присваиваете результат оператора доступа участника. Вы вызываете функцию-член. Результатом является то, что возвращает функция. Функция возвращает void, который нельзя назначить.

 (pf->y_) = 34;// error

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

...