используя POD

Возможный дубликат:
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?

10

Решение

Нет конструктора 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}) также будет ошибка, несмотря на то, что агрегат может быть создан с помощью инициализации списка. Это связано с тем, что заключенный в скобки список инициализаторов не может быть переадресован.

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]