[英]C++ Perfect Forwarding
1)
template<typename T, typename Arg>
shared_ptr<T> factory(Arg arg)
{
return shared_ptr<T>(new T(arg));
}
2)
template<typename T, typename Arg>
shared_ptr<T> factory(Arg& arg)
{
return shared_ptr<T>(new T(arg));
}
3)
template<typename T, typename Arg>
shared_ptr<T> factory(Arg const & arg)
{
return shared_ptr<T>(new T(arg));
}
*)為什么3號比1號和2號更受歡迎?
*)如果調用工廠(41),為什么要調用右值?
*)#define BOOST_ASIO_MOVE_ARG(type)type &&。 在這種情況下什么是&&?
實際上,方法#3 並不比1和2好。這完全取決於T
的構造函數。
一種有點標准的方法是使用右值引用,這是你提到的&&
。
所以,一個更好的工廠將是這樣的:(這實際上是完美的轉發 )
template<typename T, typename Arg>
std::shared_ptr<T> factory(Arg && arg)
{
return std::shared_ptr<T>(new T (std::forward<Arg>(arg)));
}
由於參考 C ++的折疊規則,這個函數可以接受(並轉發)rvalue refences和lvalue引用,也就是說,如果你傳遞一個rvalue,它會忠實地將rvalue轉發給T
的構造函數,如果你給它一個左值,兩種引用( Something & && arg
)將崩潰,左值引用將被轉發到底層構造函數。
我想我在這里介紹了你的問題,但要明確回答,
factory
函數的const&
和&
重載。 const&
版本更好,它實際上會接受臨時值,但如果你的底層T
類型有一個接受非const ref的構造函數,那么你會得到一個編譯錯誤,因為const&
不會隱式地轉換為&
。 41
的地址(這在技術上不是100%正確,但我認為用這種方式考慮左值和右值是可以的。) rvalue reference
。 你需要閱讀這個; 一個解釋不適合這里,已經有幾個偉大的只是谷歌搜索! 更新 :正如在評論中切向提到的那樣,使用make_shared
可能比使用new
ed指針構建shared_ptr
更好。 make_shared
可以通過分配控制塊(包括引用計數)以及對象本身來實現更高的效率,這將在訪問引用計數器和對象時提供更好的緩存局部性,並且還可以節省一個內存分配。 即使實現沒有優化,也不會比上面的版本差。 所以盡可能使用std::make_shared
! 這就是你在這里做的方式:
template<typename T, typename Arg>
std::shared_ptr<T> factory (Arg && arg)
{
return std::make_shared<T>(std::forward<Arg>(arg));
}
*)為什么3號比1號和2號更受歡迎?
(1)如果Arg
不可復制,則不起作用。 (2)不允許你傳遞右值,如factory<int>(42);
請注意,這三個示例都不涉及完美轉發。 我不確定你問題的主題是什么。
*)如果調用工廠(41),為什么要調用右值?
我不確定我理解這個問題。 41
是根據定義的右值。
*)#define BOOST_ASIO_MOVE_ARG(type)type &&。 在這種情況下什么是&&?
type&&
是對type
的右值引用 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.