为什么有两个std :: allocator :: construct函数?

时间:2015-07-14 07:23:11

标签: c++ c++11 allocator

该标准在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

感谢您对此有所启发: - )

1 个答案:

答案 0 :(得分:1)

答案在你发布的摘录中:一个是预先C ++ 11,一个是后C ++ 11。 i.e.Odiya_Doctor_Client最好用完美转发参数来表达,而不是调用复制构造函数,但完美转发只能在C ++ 11中使用,所以我们不得不先用第一个选项来实现它才能成为现实