我只是想知道以下两行之间是否有区别:
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
来优化多余的操作。