C++ 为什么不';t矢量中的推回<&燃气轮机;和列表<&燃气轮机;容器返回对插入元素的引用?

C++ 为什么不';t矢量中的推回<&燃气轮机;和列表<&燃气轮机;容器返回对插入元素的引用?,c++,stl,containers,C++,Stl,Containers,我意识到我可以通过调用back()来获取迭代器引用,但是为什么不同时使用push\u back()返回它呢?是出于性能原因吗?或者是由于异常安全(类似于为什么pop_back()不返回弹出的值)?无论是哪种情况,请解释。我不知道是否有官方原因,但我想到的最直接的原因是性能。如果查看push_back和push_front的大多数用法,则不会使用返回值。推送元素的位置不如推送元素重要 为什么返回一个几乎从未使用过的非自由值 各种insert函数返回迭代器的原因很简单:调用方不一定知道如何获取该元素

我意识到我可以通过调用
back()
来获取迭代器引用,但是为什么不同时使用
push\u back()
返回它呢?是出于性能原因吗?或者是由于异常安全(类似于为什么
pop_back()
不返回弹出的值)?无论是哪种情况,请解释。

我不知道是否有官方原因,但我想到的最直接的原因是性能。如果查看
push_back
push_front
的大多数用法,则不会使用返回值。推送元素的位置不如推送元素重要


为什么返回一个几乎从未使用过的非自由值

各种
insert
函数返回迭代器的原因很简单:调用方不一定知道如何获取该元素的迭代器
map::insert
set::insert
返回一个,因为否则,调用方必须搜索元素

当您执行向量::推回时,您知道插入的元素在哪里。它是
--vector.end()
。你不必去寻找它;总是那个位置。你可以在固定时间内得到它,而且很快就可以得到固定时间


因此,返回用户已经知道的内容是没有意义的。

原因是
vector
提供了一个
insert
方法,该方法将迭代器返回到插入位置。该标准的一致性在于,
push_back
不会返回值,但某些形式的
insert
会返回值,当可用且适当时。

编译器不应该在编译时丢弃它,因为它可以清楚地看到返回的迭代器没有被使用?@Samaursa通常,如果给定的方法产生返回值,编译器就不能随意优化该值的创建。它可能有副作用,这取决于调用方/被调用方。它当然可以丢弃结果,但这并不能消除creation@Samaursa除非调用是内联的,否则编译器不能丢弃它。在这种情况下,如果编译器能够证明返回值的构造没有副作用,那么编译器可能会丢弃它。@Samaursa:迭代器仍然必须从内部构造
向后推
+1。这个论点是有道理的
push_back
将元素推到后面,因此调用者基本上知道元素的去向,以及迭代器将是什么。用户知道并且可以在固定时间内得到。@nicolabolas你说得有道理。我只是假设OP想要检索一个迭代器来获取对插入对象的引用。除此之外,我看不到任何其他真正的用例。
back
不提供迭代器。它提供最后一项的参考。然后可以获取该项的
&
,但这不是迭代器。我认为让迭代器到达列表最后一项的唯一方法是使用
rbegin()
end()-1
。(可能需要是
auto x=l.end();--x;
)@AaronMcDaid:感谢您指出这一点,重新表述了这个问题。这个问题特别相关,因为C++17中的emplace_back和emplace_front(std::list)确实返回了对插入元素的引用。