Возможный дубликат:
C ++ 11 emplace_back на вектор<структура>?
Возможна ли установка с POD? Кажется, он не работает в Visual Studio 2012:
struct X
{
int a;
int b;
};
void whatever()
{
std::vector<X> xs;
X x = {1, 2};
// okay
xs.push_back(x);
// okay
xs.emplace_back(x);
//error C2661: 'X::X': error C2661: no overloaded function takes 2 arguments
xs.emplace_back(1, 2);
}
Является ли это недостатком Visual Studio 2012 или использование POD просто не работает в C ++ 11?
Нет конструктора X::X(int,int)
то, к чему вы обращаетесь emplace_back
будет использовать для построения X
объект. Использование контейнеров allocator_traits<A>::construct(allocator, p, args)
строить объекты, где p
это указатель на некоторое выделенное пространство и args
аргументы передаются конструктору. Это используется emplace_back
, это construct
вызовы функций ::new((void*)p) T(std::forward<Args>(args)...)
, поэтому он не использует равномерную инициализацию.
xs.emplace_back({1, 2})
также будет ошибка, несмотря на то, что агрегат может быть создан с помощью инициализации списка. Это связано с тем, что заключенный в скобки список инициализаторов не может быть переадресован.
Других решений пока нет …