push_back{“ George”,1}和push_backStudent“ 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 });会编译。

如果两种形式都可以编译,则两种形式的效率均相同-两种形式都可以从{.1 Student,然后调用move(如果存在)或复制构造函数。

在使用构造函数的情况下,即使构造函数为"George",1仍可编译的更有效形式为explicit,它直接在向量内部构造objStudents.emplace_back("George",1);并避免了多余的操作移动或复制。当然,这里的“更有效”是理论上的-编译器可以使用Student来优化多余的操作。