gpt4 book ai didi

c++ - 为什么 push_back 不能重载来完成 emplace_back 的工作?

转载 作者:IT老高 更新时间:2023-10-28 14:00:04 25 4
gpt4 key购买 nike

首先,我知道 this question ,但我不相信我在问同样的问题。

我知道std::vector<T>::emplace_back 确实 - 我明白为什么我会在 push_back() 上使用它.它使用可变参数模板,允许我将多个参数转发给新元素的构造函数。

但我不明白为什么 C++ 标准委员会决定需要一个新的成员函数。为什么他们不能简单地扩展 push_back() 的功能? .据我所知,push_back可以在 C++11 中重载为:

template <class... Args>
void push_back(Args&&... args);

这不会破坏向后兼容性,同时允许您传递 N 个参数,包括会调用普通右值或复制构造函数的参数。事实上,push_back() 的 GCC C++11 实现无论如何,只需调用 emplace_back:

  void push_back(value_type&& __x)
{
emplace_back(std::move(__x));
}

所以,在我看来,emplace_back() 是没有必要的。 .他们需要添加的只是 push_back() 的重载。它接受可变参数,并将参数转发给元素构造函数。

我错了吗?这里需要一个全新的功能有什么原因吗?

最佳答案

如果 T 具有显式转换构造函数,则 emplace_backpush_back 之间的行为不同。

struct X
{
int val;
X() :val() {}
explicit X(int v) :val(v) {}
};

int main()
{
std::vector<X> v;
v.push_back(123); // this fails
v.emplace_back(123); // this is okay
}

进行您建议的更改将意味着 push_back 在这种情况下是合法的,我认为这不是理想的行为。我不知道是不是这个原因,但这是我唯一能想到的。

关于c++ - 为什么 push_back 不能重载来完成 emplace_back 的工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7000594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com