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

看板C_and_CPP作者 (JOMI)時間5年前 (2019/02/25 22:58), 5年前編輯推噓1(1042)
留言43則, 4人參與, 5年前最新討論串1/1
這也是我在實務上無法想到用途的一個語法(也是知道它的意思 但還是不知道啥時該用) 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<....>(...); 還是加上&& 以上諸多盲點 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 110.28.13.96 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1551106734.A.A14.html ※ 編輯: lovejomi (110.28.13.96), 02/25/2019 23:11:54

02/26 00:21, 5年前 , 1F
你是看 cppreference 學希佳佳嗎?
02/26 00:21, 1F

02/26 09:32, 5年前 , 2F
不是 但想找資料卻看到奇怪註解
02/26 09:32, 2F

02/26 09:53, 5年前 , 3F
那你想想第一個例子如果遇到 InputRange 該怎麼辦. c
02/26 09:53, 3F

02/26 09:53, 5年前 , 4F
onst auto& 終究是 l-value ref 雖然可以綁定 xvalue
02/26 09:53, 4F

02/26 09:53, 5年前 , 5F
, 但其伴隨著 “物件一直都會存在” 的語意, 等於你
02/26 09:53, 5F

02/26 09:53, 5年前 , 6F
欺騙了使用 x 的人
02/26 09:53, 6F

02/26 11:18, 5年前 , 7F
所以如果我就算readonly也不該用const來欺騙?可是另一
02/26 11:18, 7F

02/26 11:18, 5年前 , 8F
方面auto看起來比auto&&更適合?
02/26 11:18, 8F

02/26 12:14, 5年前 , 9F
這要看你接的是不是 xvalue, auto&& 跟 auto 差在有
02/26 12:14, 9F

02/26 12:16, 5年前 , 10F
無 copy, 很少有絕對比較好的寫法, 都是各種 trade
02/26 12:16, 10F

02/26 12:16, 5年前 , 11F
off, 你還需要再多了解語言才來談這些
02/26 12:16, 11F

02/26 18:58, 5年前 , 12F
xvlaue 的話應該是copy(move)比較合適?
02/26 18:58, 12F

02/26 18:59, 5年前 , 13F
但還是不懂我這篇問的兩個cppreference的問題 ...
02/26 18:59, 13F

02/26 21:35, 5年前 , 14F

02/26 21:36, 5年前 , 15F
因為關鍵字都給你了你沒查當然不懂
02/26 21:36, 15F

02/26 21:38, 5年前 , 16F
forwarding ref 就是用來各種接, 然後接的時候保持原
02/26 21:38, 16F

02/26 21:40, 5年前 , 17F
本引數值的分類, 然後去做對應的動作, 也就是說當用
02/26 21:40, 17F

02/26 21:41, 5年前 , 18F
auto&& 的時候, 目的就是以保留值為優先, 然後再用
02/26 21:41, 18F

02/26 21:42, 5年前 , 19F
type traits 或靜態多型去處理. 你喜歡用
02/26 21:42, 19F

02/26 21:42, 5年前 , 20F
std::as_const() 也隨便, 重點不是拿到的值可不可以
02/26 21:42, 20F

02/26 21:44, 5年前 , 21F
move() 還是 readonly 這種很後面的問題, 你如果連拿
02/26 21:44, 21F

02/26 21:44, 5年前 , 22F
到的東西是什麼都不知道, 怎麼能做對合適的處理?
02/26 21:44, 22F

02/26 21:56, 5年前 , 23F

02/26 21:56, 5年前 , 24F
對照組
02/26 21:56, 24F

02/26 23:24, 5年前 , 25F
我覺得svs.emplace_back(s這邊應該用std::forward)?
02/26 23:24, 25F

02/26 23:34, 5年前 , 26F
另外你的例子 "字串"s 針對這case 只是習慣還是有好處
02/26 23:34, 26F

02/26 23:35, 5年前 , 27F
不加不也是會implicit建構嗎? 還是這樣寫有額外好處呢@@
02/26 23:35, 27F

02/27 00:06, 5年前 , 28F
兩個重點: 1) 用 const l-value reference 來接引數
02/27 00:06, 28F

02/27 00:09, 5年前 , 29F
需要保證物件不會在使用以前解構. 2) 保證 range 不
02/27 00:09, 29F

02/27 00:11, 5年前 , 30F
解構, 這不意味著用 range-based for (iterator) 取
02/27 00:11, 30F

02/27 00:12, 5年前 , 31F
來的元素也得到相同的保證
02/27 00:12, 31F

02/27 00:13, 5年前 , 32F
另外不會因為你沒寫 const auto& 就失去 constness,
02/27 00:13, 32F

02/27 00:14, 5年前 , 33F
只有 const 擺在 auto 裡面還是外面的差別, 然後買本
02/27 00:14, 33F

02/27 00:14, 5年前 , 34F
書好好看完
02/27 00:14, 34F

02/27 00:32, 5年前 , 35F

02/27 00:33, 5年前 , 36F
請問為什麼會全部都是5呀?
02/27 00:33, 36F

02/27 00:38, 5年前 , 37F
loveme大大 可以請問一下用cppref學會怎樣嗎?
02/27 00:38, 37F

02/27 12:17, 5年前 , 38F
最後一個 auto temp =.. 看你的函式返回什麼值
02/27 12:17, 38F

02/27 19:00, 5年前 , 39F
目前看起來是range裡面的string 都是xvalue 所以存到sv
02/27 19:00, 39F

02/27 19:00, 5年前 , 40F
裡面的之後都被解構了,會印全5也只是剛好值還在?
02/27 19:00, 40F

02/27 19:05, 5年前 , 41F
至於為啥address都一樣 可否推測string對於短字串實作是
02/27 19:05, 41F

02/27 19:05, 5年前 , 42F
用stack不會allocate heap所以位址都一樣(stack上的位
02/27 19:05, 42F

02/27 19:05, 5年前 , 43F
址)
02/27 19:05, 43F
文章代碼(AID): #1ST0AkeK (C_and_CPP)