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

Сообщение Re[2]: v.emplace_back(v[0]) от 08.10.2017 10:25

Изменено 08.10.2017 10:42 rg45

Re[2]: v.emplace_back(v[0])
Здравствуйте, MT-Wizard, Вы писали:

MW>Не UB, можно всё что явно не запрещено...


Согласно стандарту, все как раз наоборот:

1.3.24 undefined behavior
behavior for which this International Standard imposes no requirements


Как должна повести себя программа в случае переаллокации, никаких требований нет. И будет переаллокация или нет, тоже не известно. Так что UB в чистом виде, если не зарезервировать достаточный объем памяти заранее.

Ради интереса, попробуй выполнить на Visual Studio:

#include <iostream>
#include <string>
#include <vector>

int main()
{
   std::vector<std::string> v { "Hello" };

   while (v.size() < 100)
   {
      // v.reserve(v.size() + 1);
      v.emplace_back(v[0]);
      std::cout << v.size() << ": " << v.back() << std::endl;
   }
}
Re[2]: v.emplace_back(v[0])
Здравствуйте, MT-Wizard, Вы писали:

MW>Не UB, можно всё что явно не запрещено...


Согласно стандарту, все как раз наоборот:

1.3.24 undefined behavior
behavior for which this International Standard imposes no requirements


Как должна повести себя программа в случае переаллокации, никаких требований нет. И будет переаллокация или нет, тоже не известно. Так что UB в чистом виде, если не зарезервировать достаточный объем памяти заранее.

Ради интереса, попробуй выполнить на Visual Studio (в отладочной конфигурации assert вылетает на первой же итерации):

#include <iostream>
#include <string>
#include <vector>

int main()
{
   std::vector<std::string> v { "Hello" };

   while (v.size() < 100)
   {
      // v.reserve(v.size() + 1);
      v.emplace_back(v[0]);
      std::cout << v.size() << ": " << v.back() << std::endl;
   }
}