Bri*_*ian 16
我构造了一个简短的例子,当push_back被替换为emplace_back以下时实际上无法编译:
#include <vector>
struct S {
S(double) {}
private:
explicit S(int) {}
};
int main() {
std::vector<S>().push_back(0); // OK
std::vector<S>().emplace_back(0); // error!
}
Run Code Online (Sandbox Code Playgroud)
调用push_back需要将其参数0从type 转换int为type S.由于这是隐式转换,因此S::S(int)不会考虑显式构造函数,并且S::S(double)会调用它.在另一方面,emplace_back进行直接初始化,这样既S::S(double)和S::S(int)被考虑.后者是一个更好的匹配,但它是private,所以该程序是不正确的.