#include <vector>
#include <string>
#include <iostream>
struct PersonA {
int age; std::string name;
PersonA(int _age, const std::string& _name) : age(_age), name(_name) {}
};
struct PersonB {
int age; std::string name;
PersonB(int _age, const std::string&& _name): age(_age), name(_name) {}
};
struct PersonC {
int age; std::string name;
};
int main()
{
std::vector<PersonA> personA;
personA.emplace_back(10, "nameA"); // fine
std::vector<PersonB> personB;
personB.emplace_back(10, "nameB"); // fine
std::vector<PersonC> personC;
//personC.emplace_back(10, "nameC"); // (the implicit move constructor) not viable
// (the implicit default constructor) not viable
personC.emplace_back(); // UPDATE: fine.
}
问题&GT;为什么vector::emplace_back
请求显式定义构造函数,否则以下行不起作用?
// why it cannot make use of the default constructor of PersonC?
personC.emplace_back(10, "nameC");
此外,vector::emplace_back
不支持统一初始化。这是否与上述问题有关?
谢谢
答案 0 :(得分:6)
std::emplace_back()
获取您提供给它的参数并完美地将它们转发给它应该创建的value_type
对象的构造函数(在您的情况下,PersonC
)。
C ++ 11 Standard的表101规定了emplace_back()
:
表达式:
a.emplace_back(args)
返回类型:
void
操作语义:追加构造为
T
的对象std::forward<Args>(args)...
强>
没有PersonC
的构造函数接受int
和const char*
(或任何可以从int
和const char*
构建的内容,分别),因此错误。
如果您想知道,编译器可以隐式定义的唯一构造函数是默认构造函数,复制构造函数和移动构造函数。