Информация об изменениях

Сообщение Re[3]: Тип переменной цикла for от 23.01.2019 8:37

Изменено 23.01.2019 8:44 rg45

Re[3]: Тип переменной цикла for
Здравствуйте, sergii.p, Вы писали:

SP>а я и не шутил. Программист образца 98 года конечно ставил const & и больше не думал. Но после 11-го года программист задаёт себе извечный вопрос: а можно ли (и надо ли) мне будет перемещать элементы контейнера. Ну для меня решить этот вопрос не так то и легко. Надо сразу взвесить много факторов. И зачастую точно ответить на вопрос иногда не получается. Тогда приходит на помощь auto&&. Я так пишу и даже не останавливаюсь. Откажусь я от перемещения, или, наоборот, буду перемещать: мне уже всё равно — шапка цикла останется неизменной.


А вот здесь тебя ждет засада: переменная цикла, объявленная как auto&& в любом случае будет lvalue ссылкой, несмотря на значок "&&". Она может оказаться константной ссылкой, а может оказаться неконстантной — в зависимости от константности самого контейнера, но, в любом случае, это будет lvalue ссылка. Так что перемещать элементы конейнера без явного использования std::move (или развноценного преобразования) тебе все равно не удастся.

https://ideone.com/AFDBwx

#include <vector>

int main()
{
   std::vector<int> v {1, 2, 3};

   for (auto&& e : v)   
   {
         int&& rr = e; // error: cannot bind ‘int’ lvalue to ‘int&&’
   }
}
Re[3]: Тип переменной цикла for
Здравствуйте, sergii.p, Вы писали:

SP>а я и не шутил. Программист образца 98 года конечно ставил const & и больше не думал. Но после 11-го года программист задаёт себе извечный вопрос: а можно ли (и надо ли) мне будет перемещать элементы контейнера. Ну для меня решить этот вопрос не так то и легко. Надо сразу взвесить много факторов. И зачастую точно ответить на вопрос иногда не получается. Тогда приходит на помощь auto&&. Я так пишу и даже не останавливаюсь. Откажусь я от перемещения, или, наоборот, буду перемещать: мне уже всё равно — шапка цикла останется неизменной.


А вот здесь тебя ждет засада: переменная цикла, объявленная как auto&& в любом случае будет lvalue ссылкой, несмотря на значок "&&". Она может оказаться константной ссылкой, а может оказаться неконстантной — в зависимости от константности самого контейнера. Но, в любом случае, это будет lvalue ссылка. Так что перемещать элементы конейнера без явного использования std::move (или развноценного преобразования) тебе все равно не удастся.

https://ideone.com/AFDBwx

#include <vector>

int main()
{
   std::vector<int> v {1, 2, 3};

   for (auto&& e : v)   
   {
         int&& rr = e; // error: cannot bind ‘int’ lvalue to ‘int&&’
   }
}


P.S. Да, за исключением единственного случая — std::vector&lt;bool&gt;
Автор: B0FEE664
Дата: 21.01.19