2013-07-02 88 views
4
#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. 
} 

问题>为什么vector::emplace_back请求构造函数的显式定义,否则以下行不起作用?为什么默认的构造函数不适用于`vector :: emplace_back`

// why it cannot make use of the default constructor of PersonC? 
personC.emplace_back(10, "nameC"); 

此外,vector::emplace_back不支持统一初始化。这是否与上述问题有关?

谢谢

+1

是,由于缺乏'emplace_back'的使用统一的初始化是发生这种情况的原因。 –

+2

谨防因使用前导下划线... –

回答

6

std::emplace_back()需要你提供给它的参数和完善批转他们就应该创造value_type对象的构造函数(在你的情况,PersonC)。

表C++ 11标准的101指定的emplace_back()语义:

表达a.emplace_back(args)

返回类型void

操作语义:追加T类型的对象与 std::forward<Args>(args)...构成。

没有接受一个intconst char*(或可能从分别intconst char*,来构建任何东西)的PersonC构造,因此错误。

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

+1

坏的,我认为我得到了我的问题。编译器确实提供了一个默认构造函数,但它不提供一个带有两个参数的构造函数! – q0987

+0

@ q0987:对,这样的构造函数永远不会隐式生成 –

+0

总是知道的规则,只是感到困惑,我自己:) – q0987

相关问题