почему есть две функции std::allocator::construct?

Стандарт предоставляет две функции конструкции в std::allocator<T> для размещения нового синтаксиса ниже:

void construct( pointer p, const_reference val );  (1)  (until C++11)

template< class U, class... Args >
void construct( U* p, Args&&... args );            (2)  (since C++11)

1) Calls new((void *)p) T(val)
2) Calls ::new((void *)p) U(std::forward<Args>(args)...) 

В чем разница между 1) и 2), кроме того факта, что мы передаем все аргументы конструктору в 2) По какой причине нам нужно 1)?

Представьте, что у нас будет только подпись 2) , тогда передача аргумента из (несуществующей) первой приведет к вызову:

::new((void *)p) T(std::forward<const_reference>val) 

который все равно должен вызывать конструктор копирования T(val)? Вот я и спрашиваю, какой смысл в дополнительной подписи 1)? Есть разница, что один вызывает new, а другой — глобальную функцию ::new.

Спасибо, что пролили свет на это :-)


person Gabriel    schedule 14.07.2015    source источник
comment
Здесь только один. «До» и «с тех пор» взаимоисключающие.   -  person chris    schedule 14.07.2015
comment
ааа, упс, это все решило   -  person Gabriel    schedule 14.07.2015


Ответы (1)


Ответ содержится в опубликованных вами выдержках: один — до С++ 11, а другой — после С++ 11. construct лучше всего выражается аргументами совершенной переадресации, а не вызовом конструктора копирования, но совершенная переадресация доступна только в C++11, поэтому нам пришлось обойтись первым вариантом, прежде чем это стало реальностью.

person TartanLlama    schedule 14.07.2015