我在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.
}
}
答案 0 :(得分:7)
通过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
建议(我个人)对此并不负责。
答案 1 :(得分:4)
std::cout << vec.emplace_back(7);
这只是方便,所以您可以在表达式中做很多事情。
vec.emplace_back().reg();
它所做的任何事情都可以复制
(void(vec.emplace_back()), vec.back()).reg();
在C ++ 17之前的版本中(此处避免过时的偏执狂)
创建对象并立即使用它是一种常见的模式;返回值使其变得更容易。