如果s
稍后在代码中不需要,那么这是对emplace_back()
函数的滥用。这是因为您正在调用S
类的复制构造函数,而不是将参数传递给emplace_back()
将使用S
.
考虑以下代码:
#include <iostream>
#include <vector>
struct S
{
S() {std::cout<< " default ctor" <<std::endl;}
S(int) {std::cout<< " user-def ctor" <<std::endl;}
S(const S &) {std::cout<< " copy ctor" <<std::endl;}
S(S &&) {std::cout<< " move ctor" <<std::endl;}
};
int main()
{
std::vector<S> v;
v.reserve(5);
std::cout<< "auto calls: " <<std::endl;
auto s = S();
std::cout<<std::endl;
std::cout<< "emplace_back( s ) calls: " <<std::endl;
v.emplace_back(s);
std::cout<<std::endl;
std::cout<< "emplace_back( std::move(s) ) calls: " <<std::endl;
v.emplace_back(std::move(s));
std::cout<<std::endl;
std::cout<< "emplace_back( S{} ) calls: " <<std::endl;
v.emplace_back(S{});
std::cout<<std::endl;
std::cout<< "emplace_back( ) calls: " <<std::endl;
v.emplace_back();
std::cout<<std::endl;
std::cout<< "emplace_back( 2 ) calls: " <<std::endl;
v.emplace_back(2);
std::cout<<std::endl;
}
结果是:
auto calls:
default ctor
emplace_back( s ) calls:
copy ctor
emplace_back( std::move(s) ) calls:
move ctor
emplace_back( S{} ) calls:
default ctor
move ctor
emplace_back( ) calls:
default ctor
emplace_back( 2 ) calls:
user-def ctor
预留空间用于分配 5S
秒的空间。在不保留空间的情况下,输出将包括从向量中对复制 ctor 的额外调用。
当您只是将参数传递给S
(在这种情况下,什么都没有)的构造函数时,emplace_back()
直接在向量内使用默认 ctor 创建一个 S 对象。
顺便说一句,请参阅Godbolt 中的示例,在这些情况下这是您的朋友,以确切了解后台发生的情况。