Стандарт предоставляет две функции конструкции в 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
.
Спасибо, что пролили свет на это :-)