- 论坛徽章:
- 2
|
回复 1# Ruckus优科
- void push_back(const value_type& x);
- void push_back(value_type&& x);
- template <class... Args> void emplace_back(Args&&... args);
复制代码 第1个是c++98的。
第2个是c++11的。 因为value_type&& x只能绑定右值, 所以可以将x用作move。
第3个也是c++11的。 Args&&不一定是右值引用, 这个东西叫universal references或forwarding references。
这个解释起来有些复杂。。。 还是看 Universal References in C++11—Scott Meyers 比较专业。。。
于是可以先从另一个(也许会更容易)的方式看待C++11新加入的这两货 —— push_back(&&)和emplace_back —— 的不同, 就是emplace_back的参数个数。。。
push_back的右值重载,传递的始终是一个参数, 类型是容器的元素类型。
vector<string> xs;
xs.push_back("implicit"); // 实际是调用/* non explict */ string(const char* s)构造一个临时的string对象
xs.push_back(string("explicit")); // 是显式调用 string(const char* s)构造。。。
xs.push_back(string("hello world", 5)); // 是调用 string (const char* s, size_t n) 构造。。。
xs.push_back(string(6, '0')); // 调用 string (size_t n, char c) 。。。
xs.push_back(string()); // 调用 string() 默认构造。。。
它们都是先用各种参数构造一个临时的string作为push_back的参数, 通过它构造出xs内的那个元素, 即xs.back()。 然后销毁那个临时的string。
语义上总共两个构造。 一个析构。 第2个构造是通过move。
而emplace_back是不定长,不定类型的函数模板。
xs.emplace_back("explicit"); // string(const char* s)
xs.emplace_back("hello world", 5); // string (const char* s, size_t n)
xs.emplace_back(6, '0'); // string (size_t n, char c)
xs.emplace_back(); // string()
这些参数(包括最后一个没有参数)转发到string的构造函数(包括默认构造函数), 直接构造xs.back()。
语义上总共一个构造。 零个析构。 |
|