首先,我知道这个问题,但我不相信我会问同样的事情.
我知道什么std::vector<T>::emplace_back 呢 -我明白我为什么会使用它了push_back().它使用可变参数模板,允许我将多个参数转发给新元素的构造函数.
但我不明白为什么C++标准委员会决定需要一个新的成员函数.为什么他们不能简单地扩展功能push_back().据我所见,push_back可以在C++ 11中重载:
template <class... Args>
void push_back(Args&&... args);
Run Code Online (Sandbox Code Playgroud)
这不会破坏向后兼容性,同时允许您传递N个参数,包括将调用正常rvalue或复制构造函数的参数.事实上,GCC C++ 11实现push_back()只需调用emplace_back:
void push_back(value_type&& __x)
{
emplace_back(std::move(__x));
}
Run Code Online (Sandbox Code Playgroud)
所以,我看到它的方式,没有必要emplace_back().他们需要添加的是一个重载,push_back()它接受可变参数,并将参数转发给元素构造函数.
我错了吗?有什么理由需要一个全新的功能吗?
Ben*_*ley 42
如果T有一个显式转换构造函数,则emplace_back和之间存在不同的行为push_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
}
Run Code Online (Sandbox Code Playgroud)
做出你所建议的改变意味着push_back在那种情况下这是合法的,我认为这不是理想的行为.我不知道这是不是这个原因,但这是我能想到的唯一一件事.
| 归档时间: |
|
| 查看次数: |
2755 次 |
| 最近记录: |