2013-07-02 3 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).

Таблица 101 C++ 11 Стандарт определяет на семантику emplace_back():

Expression: a.emplace_back(args)

Возврат типа: void

Операционная семантика: Присоединяет объект типа Tпостроенный с std::forward<Args>(args)....

Там нет конструктора PersonC, который принимает int и const char* (или что-нибудь, которые могут быть построены из int и const char*, соответственно), следовательно, ошибки.

В случае, если вам интересно, единственными конструкторами, которые компилятор может, неявно определяют конструктор по умолчанию, конструктор копирования и конструктор перемещения.

+1

Думаю, у меня есть проблема, которую я имел. Компилятор предоставляет конструктор по умолчанию, но не предоставляет конструктор с двумя параметрами! – q0987

+0

@ q0987: Правильно, такие конструкторы никогда не создаются неявно. –

+0

всегда знает правило и просто путаю себя :) – q0987

Смежные вопросы