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

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,然后调用move(如果存在)或copy构造函数。
在使用构造函数的情况下,即使构造函数是"George", 1,也可以编译的更有效形式是explicit,它可以直接在 vector 内部构造objStudents.emplace_back("George", 1);并避免多余的移动或复制。当然,这里的“更有效”是理论上的-编译器也许可以使用Student来优化多余的操作。

10-08 08:54