在C++ 17中std :: vector :: emplace_back的返回值的用例是什么?

Con*_*nst 2 c++ stdvector emplace c++17

我在cppreference.com上读过新的(自C++ 17以来)std::vector::emplace_back对插入元素的referance返回值.

返回值

  • (无)(直到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.
    }
}
Run Code Online (Sandbox Code Playgroud)

xsk*_*xzr 7

更改由P0084完成.作者给出的动机是

我经常发现自己想要使用emplace_frontor 创建容器emplace_back元素,然后访问该元素,要么进一步修改它,要么只是使用它.所以我发现自己编写的代码如下:

my_container.emplace_back(...);
my_container.back().do_something(...);
Run Code Online (Sandbox Code Playgroud)

也许:

my_container.emplace_back(...);
do_something_else(my_container.back());
Run Code Online (Sandbox Code Playgroud)

相当常见的具体情况是我需要构造一个对象,然后才能获得将其置于最终状态所需的所有信息,例如当我从文件中读取它时:

my_container.emplace_back(); // Default construct.
my_container.back().read(file_stream); // Read the object.
Run Code Online (Sandbox Code Playgroud)

这种情况经常发生,我倾向于编写调用某些版本emplace并返回的小模板,这对我来说似乎没有必要.我相信emplace_frontemplace_back函数应该返回对新创建元素的非const引用,以符合当前标准库在实际中返回有用信息的趋势.原始emplace提案中的疏忽(就我而言)他们没有.