为什么默认构造函数不适用于`vector :: emplace_back`

时间:2013-07-02 16:51:58

标签: c++ c++11

#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不支持统一初始化。这是否与上述问题有关?

谢谢

1 个答案:

答案 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的构造函数接受intconst char*(或任何可以从intconst char*构建的内容,分别),因此错误。

如果您想知道,编译器可以隐式定义的唯一构造函数是默认构造函数,复制构造函数和移动构造函数。