2016-07-12 3 views
0

Учитывая-структуру:простых структур с make_unique и emplace_back

struct S { 
    int x; 
    int y; 
} 

Почему стандарт позволяет нам сделать это:

std::vector<S> vec; 
vec.emplace_back(1, 2); 

Но не позволяет сделать это:

auto ptr = std::make_unique<S>(1, 2); 

?

+1

Прекрасно работает со мной http://coliru.stacked-crooked.com/a/7c54feda67017bf1 (я должен был добавить конструктор в структуры, но это все) – Pumkko

+3

Нет, оба [не разрешено] (HTTP://rextester.com/WBNIK94302). Если вы предоставите ctor ('S :: S (int, int)'), то оба будут [fine] (http://rextester.com/UHFEW17433). – songyuanyao

+0

@Pumkko Я имел в виду ровно простую структуру без ctor :) – vladon

ответ

4

Пожалуйста, проверьте ваш код.

В cpp14 вашем примере код не компилируется: https://ideone.com/ewyHW6

Оба make_unique и emplace_back используют std::forward<Args>(args)... в фоновом режиме, так как оба или никто не собирает.

+0

извините, моя вина ( – vladon

+0

@ vladon никто не идеален. Ошибки случаются :-) – paweldac

1

На самом деле не работает.

Было решено, что функции построения стиля в стиле С ++ std будут строить с () s не {} s. Нет strong Причина, по которой это было выбрано (что я знаю).

emplace_alt СНД make_unique_alt могут быть добавлены к std где конструктов с помощью {} вместо этого. (естественно, должно быть выбрано лучшее имя)

Итак, короткий ответ «потому что std говорит так». Средний ответ - «это почти произвольный выбор, сделанный std, а затем в другом месте, чтобы быть последовательным». Долгий ответ будет заключаться в том, чтобы быть в комнате, где это произошло, и где оно было пересмотрено: это не длинный ответ.

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