而不是
const auto && obj = create();
...寫信只是
const auto object = create();
...或
const auto object{ create() };
的=
依賴於編譯器eliding拷貝構造函數調用,但我不知道任何現存的編譯器,它無法做到這一點。
獲得的清晰度比國際海事組織提供的擔保要重要得多(如果使用參考,請使用普通&
參考)。也就是說,避免讓維護程序員浪費時間來理解參考的基本原理。如果明確指定了類型,那麼可能是多態引用的情況,Petru Marginean的詭計,但是auto
這是不可能的,因此維護程序員在一段時間的付費時間內仍然摸不着頭。
在另一方面,const T&&
可以是函數重載作爲參數類型有用搭上臨時作爲參數的情況下,以同樣的方式作爲&&
限定符成員函數被認爲具有足夠有用將要通過在標準中。例如,即使我不建議這樣做,如果存儲了一個指向實際參數的指針供以後使用,那麼可能不希望存儲指向臨時指針的指針,該臨時指針最終會成爲懸掛指針:
struct Expr{ virtual ~Expr(){} };
struct Sum_expr: Expr
{
const Expr* a_;
const Expr* b_;
Sum_expr(Expr const& a,Expr const& b): a_(&a), b_(&b) {}
template< class A >
Sum_expr(A&&, Expr const&& b) = delete;
template< class B >
Sum_expr(Expr const&& a, B&&) = delete;
};
auto main()
-> int
{
Expr a;
Expr b;
Sum_expr sum{ a, b };
Sum_expr sum2{ a, Expr() }; //! Nope, won't compile.
}
注:這裏A&&
和B&&
同時支持右值和左值實際參數,即他們不一定右值引用,因爲他們普遍引用。
但是,不是重載和區分的情況下,我認爲我會使一個指針正式參數,即使一個指針技術上可以是一個空指針,因爲就我所見,它與我習以爲常的更清楚地傳達意圖。
Sum_expr(Expr const* a, Expr const* b);
你可以用'const auto&'完成同樣的事情。 – StoryTeller
僅供參考,您可以在所需的時間點擊YouTube視頻,然後選擇「當前時間複製視頻網址」,該鏈接可直接鏈接到該時間點:https://youtu.be/dTeKf5Oek2c?t = 2937 – Tas
您應該或許可以解釋爲什麼'const auto &&'在問題的主體中被認爲沒有用處。 – juanchopanza