簡體   English   中英

C ++完美轉發

[英]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 )將崩潰,左值引用將被轉發到底層構造函數。

我想我在這里介紹了你的問題,但要明確回答,

  • #3 不是這里的首選方法。 即使在C ++ 11之前,您可能也想要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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM