该标准在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
感谢您对此有所启发: - )
答案 0 :(得分:1)
答案在你发布的摘录中:一个是预先C ++ 11,一个是后C ++ 11。 i.e.Odiya_Doctor_Client
最好用完美转发参数来表达,而不是调用复制构造函数,但完美转发只能在C ++ 11中使用,所以我们不得不先用第一个选项来实现它才能成为现实