почему —list.end () компилируется?

  • лист end() возвращает копию последнего итератора, верно?
  • Следовательно, list.end() это значение, верно?
  • — оператор-функция, перегруженная для итератора списка, принимает неконстантную ссылку, верно?
  • Вы не можете привязать значения к неконстантным ссылкам, верно?

Так как же получается

std::list<int> lst;
// ...
--l.end();`

компилировать?

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

struct A{};

void f(A&)
{

}
A a()
{
return A();
}

int main()
{
f(a());
}

9

Решение

  • — оператор-функция, перегруженная для итератора списка, принимает неконстантную ссылку, верно?

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


Что касается редактирования (прохождение Rvalue в f(A&){}), это нестандартное расширение. я Угадай вы используете компилятор Microsoft, потому что я знаю, что у него нестандартное расширение, что, на мой взгляд, глупо.

12

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]