Каков сценарий использования возвращаемого значения для std :: vector :: emplace_back в C ++ 17? - PullRequest
0 голосов
/ 10 ноября 2018

Я прочитал в cppreference.com , что новый (начиная с C ++ 17) std::vector::emplace_back имеет возвращаемое значение ссылки на вставленный элемент.

Возвращаемое значение

  • (нет) (до C ++ 17)
  • Ссылка на вставленный элемент. (начиная с C ++ 17)

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

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

#include <vector>

int main()
{
    std::vector<int> myVec;
    for(int i = 0; i < 3; ++i)
    {
        int& newElement = myVec.emplace_back(i);
        ^^^^^^^ => why standard should expose the element after inserting.
    }
}

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Изменение производится P0084 .Мотивация, которую дает автор:

Я часто хочу создать элемент контейнера, используя emplace_front или emplace_back, и затем получить доступ к этому элементу, либо для его дальнейшего изменения, либо просто дляиспользуй это.Поэтому я нахожу себя пишущим код, подобный этому:

my_container.emplace_back(...);
my_container.back().do_something(...);

Или, возможно:

my_container.emplace_back(...);
do_something_else(my_container.back());

Довольно частый случай, когда мне нужно создать объект, прежде чем я получу всю необходимую информациючтобы перевести его в конечное состояние, например, когда я читаю его из файла:

my_container.emplace_back(); // Default construct.
my_container.back().read(file_stream); // Read the object.

Это происходит достаточно часто, и я, как правило, пишу небольшие шаблоны, которые вызывают некоторую версию emplace и возвращаютназад, что мне кажется довольно ненужным.Я полагаю, что функции emplace_front и emplace_back должны возвращать неконстантную ссылку на вновь созданный элемент в соответствии с текущей тенденцией стандартной библиотеки возвращать полезную информацию, когда это практически возможно.Это было упущением (с моей стороны) в первоначальном предложении emplace, которого они не делают.

0 голосов
/ 10 ноября 2018
std::cout << vec.emplace_back(7);

это просто удобство, поэтому вы можете сделать больше, чем одну вещь в выражении.

vec.emplace_back().reg();

все, что сделано, может быть воспроизведено с помощью

(void(vec.emplace_back()), vec.back()).reg();

в версиях, предшествующих C ++ 17 (void здесь - перспективная парноия)

Это обычный шаблон для создания объекта и его немедленного использования; возвращаемое значение делает его немного легче.

...