Какой вариант оператора [] в std :: vector вызывается при выполнении следующей строки и почему? - PullRequest
0 голосов
/ 03 марта 2020

Согласно C ++ Reference Оператор [] std :: vector имеет 2 варианта

  1. reference operator[] (size_type n);
  2. const_reference operator[] (size_type n) const;

Когда мы выполним следующую строку, какой из вышеприведенных вариантов будет вызван?

std::vector<int> vlist;
vlist[0] = 7;

Думаю, 1-й вариант не должен вызываться, так как я присваиваю rvalue неконстантной ссылке lvalue, путь int& x = 7; незаконен.

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Первый вариант называется. int &x = 7; не является законным, потому что это определение. Но int &x = y; x = 7; прекрасно. И здесь вы получаете уже созданную ссылку, так что назначение в порядке. Также назначение const неконстантным не является проблемой, потому что вы можете создать неконстантную копию const;

1 голос
/ 03 марта 2020

Поскольку vlist не является константой, будет вызвана первая опция (неконстантная).

Компилятор ищет наиболее правильный метод для вызова.

Только const методы могут быть вызваны для константных объектов. Если у вас есть неконстантный объект, можно вызывать как константные, так и неконстантные методы объекта.

Если существуют как константные, так и неконстантные реализации метода, будет вызвана правильная , в зависимости от константности самого объекта.

Ваш пример int& x = 7 действительно неверен, но это не тот случай, представленный выше (vlist[0] = 7). Вы правы, что нельзя объявить ссылку на rvalue. Но присвоение rvalue эталонному объекту совершенно нормально.

...