c++ - Push_back({ "George", 1 }) 和 Push_back(Student ("Jack", 10)); 有什么区别

标签 c++ c++11 object-construction aggregate-type

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

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来自例如"George", 1然后调用移动(如果存在)或复制构造函数。

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

关于c++ - Push_back({ "George", 1 }) 和 Push_back(Student ("Jack", 10)); 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64523154/

相关文章:

c++ - 无法打开存储在字符串 C++ 中的文件名

c++ - 在 CUDA 头 (.cuh) 文件中使用常量内存时出现 LNK2005 错误

c++ - 大括号初始值设定项列表作为函数参数

c++ - 简单的 unique_ptr 问题

c++ - 对象构造/前向函数声明歧义

java - JVM 是否在内部实例化抽象类的对象?

c++ - 如何分离while循环?

c++ - 是否有一个开放源代码库可帮助您阅读Microsoft复合二进制文件?

c++ - 如何与 CRTP 一起使用?

java - 我应该在构造时加载 Java 对象的数据,还是通过方法调用显式加载?