Re: [問題] 什麼時候用 auto&&?

作者: lovejomi (JOMI)   2019-02-25 22:58:49
這也是我在實務上無法想到用途的一個語法(也是知道它的意思 但還是不知道啥時該用)
https://en.cppreference.com/w/cpp/language/reference
2) auto&& except when deduced from a brace-enclosed initializer list:
這邊寫到
for (auto&& x: f()) {
// x is a forwarding reference; this is the safest way to use range for
loops
}
為什麼說這是最safest的? 如果只是readonly 的話寫const auto&不是更好?
另外是他寫
auto&& z = {1, 2, 3}; // *not* a forwarding reference (special case for
initializer lists)
為什麼說"不是"?
https://ideone.com/fYlKY4
這樣驗證感覺就一樣啊? special在哪?
但看完還是不知道什麼時候必須用auto&&
如果說
一個函數 Type Func();
我用auto&& temp = Func(); or auto temp = Func();
然後把它std::move(temp) 給其他函數
前者可能少一次move construct
但印象中有文章說 這樣反而會讓optimization 受限?
但其實實務上比較會寫 const auto& temp = Func();
然後在copy給其他函數
這樣寫起來反而變成一定要用copy了? 這樣有了move 是不是根本就不要加上const&
而是都用auto temp = Func(); 這樣來反而好?
問題都是從
https://en.cppreference.com/w/cpp/utility/any/any_cast
我不知道要寫auto temp = std::any_cast<....>(...); 還是加上&&
以上諸多盲點
謝謝
作者: loveme00835 (髮箍)   2019-02-26 00:21:00
你是看 cppreference 學希佳佳嗎?
作者: lovejomi (JOMI)   2019-02-26 09:32:00
不是 但想找資料卻看到奇怪註解
作者: loveme00835 (髮箍)   2019-02-26 09:53:00
那你想想第一個例子如果遇到 InputRange 該怎麼辦. const auto& 終究是 l-value ref 雖然可以綁定 xvalue, 但其伴隨著 “物件一直都會存在” 的語意, 等於你欺騙了使用 x 的人
作者: lovejomi (JOMI)   2019-02-26 11:18:00
所以如果我就算readonly也不該用const來欺騙?可是另一方面auto看起來比auto&&更適合?
作者: loveme00835 (髮箍)   2019-02-26 12:14:00
這要看你接的是不是 xvalue, auto&& 跟 auto 差在有無 copy, 很少有絕對比較好的寫法, 都是各種 tradeoff, 你還需要再多了解語言才來談這些
作者: lovejomi (JOMI)   2019-02-26 18:58:00
xvlaue 的話應該是copy(move)比較合適?但還是不懂我這篇問的兩個cppreference的問題 ...
作者: loveme00835 (髮箍)   2019-02-26 21:35:00
https://wandbox.org/permlink/LD7o1DtjyfQ4h7ja因為關鍵字都給你了你沒查當然不懂forwarding ref 就是用來各種接, 然後接的時候保持原本引數值的分類, 然後去做對應的動作, 也就是說當用auto&& 的時候, 目的就是以保留值為優先, 然後再用type traits 或靜態多型去處理. 你喜歡用std::as_const() 也隨便, 重點不是拿到的值可不可以move() 還是 readonly 這種很後面的問題, 你如果連拿到的東西是什麼都不知道, 怎麼能做對合適的處理?https://wandbox.org/permlink/oKfggidG9EpM8XFo對照組
作者: lovejomi (JOMI)   2019-02-26 23:24:00
我覺得svs.emplace_back(s這邊應該用std::forward)?另外你的例子 "字串"s 針對這case 只是習慣還是有好處不加不也是會implicit建構嗎? 還是這樣寫有額外好處呢@@
作者: loveme00835 (髮箍)   2019-02-27 00:06:00
兩個重點: 1) 用 const l-value reference 來接引數需要保證物件不會在使用以前解構. 2) 保證 range 不解構, 這不意味著用 range-based for (iterator) 取來的元素也得到相同的保證另外不會因為你沒寫 const auto& 就失去 constness,只有 const 擺在 auto 裡面還是外面的差別, 然後買本書好好看完
作者: lovejomi (JOMI)   2019-02-27 00:32:00
https://wandbox.org/permlink/7qm5ZH9jvicEoMJE請問為什麼會全部都是5呀?
作者: yilanP (Train Station)   2019-02-27 00:38:00
loveme大大 可以請問一下用cppref學會怎樣嗎?
作者: hunandy14 (Charlott.HonG)   2019-02-27 12:17:00
最後一個 auto temp =.. 看你的函式返回什麼值
作者: lovejomi (JOMI)   2019-02-27 19:00:00
目前看起來是range裡面的string 都是xvalue 所以存到sv裡面的之後都被解構了,會印全5也只是剛好值還在?至於為啥address都一樣 可否推測string對於短字串實作是用stack不會allocate heap所以位址都一樣(stack上的位址)

Links booklink

Contact Us: admin [ a t ] ucptt.com