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
.
形式的额外操作
我只是想知道以下两行之间是否有区别:
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
.