push_back({ "George", 1 }) 和 push_back(Student("Jack", 10)) 有什么区别?

What's the difference between push_back({ "George", 1 }) and push_back(Student("Jack", 10));

我只是想知道以下两行之间是否有区别:

objStudents.push_back({ "George", 1 });
objStudents.push_back(Student("Jack", 10));

一种方法比另一种方法更有效吗?或者只是完成相同任务的不同语法?

假设 Student 有一个带有正确参数的构造函数,区别在于 objStudents.push_back(Student("Jack", 10)); 总是编译, objStudents.push_back({ "George", 1 }); 仅在未声明构造函数时编译 explicit。另一方面,如果 Student 是一个集合(例如 struct Student { string s; int i; };),则只有 objStudents.push_back({ "George", 1 }); 可以编译。

如果编译,这两种形式都同样有效 - 都从例如 Student 构造 Student "George", 1 随后调用移动(如果存在)或复制构造函数。

在有构造函数的情况下,一种更有效的形式,即使构造函数是 explicit 也能编译,是 objStudents.emplace_back("George", 1);,它直接在向量内部构造 Student 并避免额外的移动或复制。当然,这里的“更高效”是理论上的——编译器可以优化掉 push_back.

形式的额外操作