作者lovejomi (JOMI)
看板C_and_CPP
标题Re: [问题] 什麽时候用 auto&&?
时间Mon Feb 25 22:58:49 2019
这也是我在实务上无法想到用途的一个语法(也是知道它的意思 但还是不知道啥时该用)
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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1551106734.A.A14.html
※ 编辑: lovejomi (110.28.13.96), 02/25/2019 23:11:54
1F:→ loveme00835: 你是看 cppreference 学希佳佳吗? 02/26 00:21
2F:→ lovejomi: 不是 但想找资料却看到奇怪注解 02/26 09:32
3F:→ loveme00835: 那你想想第一个例子如果遇到 InputRange 该怎麽办. c 02/26 09:53
4F:→ loveme00835: onst auto& 终究是 l-value ref 虽然可以绑定 xvalue 02/26 09:53
5F:→ loveme00835: , 但其伴随着 “物件一直都会存在” 的语意, 等於你 02/26 09:53
6F:→ loveme00835: 欺骗了使用 x 的人 02/26 09:53
7F:→ lovejomi: 所以如果我就算readonly也不该用const来欺骗?可是另一 02/26 11:18
8F:→ lovejomi: 方面auto看起来比auto&&更适合? 02/26 11:18
9F:→ loveme00835: 这要看你接的是不是 xvalue, auto&& 跟 auto 差在有 02/26 12:14
10F:→ loveme00835: 无 copy, 很少有绝对比较好的写法, 都是各种 trade 02/26 12:16
11F:→ loveme00835: off, 你还需要再多了解语言才来谈这些 02/26 12:16
12F:→ lovejomi: xvlaue 的话应该是copy(move)比较合适? 02/26 18:58
13F:→ lovejomi: 但还是不懂我这篇问的两个cppreference的问题 ... 02/26 18:59
15F:→ loveme00835: 因为关键字都给你了你没查当然不懂 02/26 21:36
16F:→ loveme00835: forwarding ref 就是用来各种接, 然後接的时候保持原 02/26 21:38
17F:→ loveme00835: 本引数值的分类, 然後去做对应的动作, 也就是说当用 02/26 21:40
18F:→ loveme00835: auto&& 的时候, 目的就是以保留值为优先, 然後再用 02/26 21:41
19F:→ loveme00835: type traits 或静态多型去处理. 你喜欢用 02/26 21:42
20F:→ loveme00835: std::as_const() 也随便, 重点不是拿到的值可不可以 02/26 21:42
21F:→ loveme00835: move() 还是 readonly 这种很後面的问题, 你如果连拿 02/26 21:44
22F:→ loveme00835: 到的东西是什麽都不知道, 怎麽能做对合适的处理? 02/26 21:44
24F:→ loveme00835: 对照组 02/26 21:56
25F:→ lovejomi: 我觉得svs.emplace_back(s这边应该用std::forward)? 02/26 23:24
26F:→ lovejomi: 另外你的例子 "字串"s 针对这case 只是习惯还是有好处 02/26 23:34
27F:→ lovejomi: 不加不也是会implicit建构吗? 还是这样写有额外好处呢@@ 02/26 23:35
28F:→ loveme00835: 两个重点: 1) 用 const l-value reference 来接引数 02/27 00:06
29F:→ loveme00835: 需要保证物件不会在使用以前解构. 2) 保证 range 不 02/27 00:09
30F:→ loveme00835: 解构, 这不意味着用 range-based for (iterator) 取 02/27 00:11
31F:→ loveme00835: 来的元素也得到相同的保证 02/27 00:12
32F:→ loveme00835: 另外不会因为你没写 const auto& 就失去 constness, 02/27 00:13
33F:→ loveme00835: 只有 const 摆在 auto 里面还是外面的差别, 然後买本 02/27 00:14
34F:→ loveme00835: 书好好看完 02/27 00:14
36F:→ lovejomi: 请问为什麽会全部都是5呀? 02/27 00:33
37F:推 yilanP: loveme大大 可以请问一下用cppref学会怎样吗? 02/27 00:38
38F:→ hunandy14: 最後一个 auto temp =.. 看你的函式返回什麽值 02/27 12:17
39F:→ lovejomi: 目前看起来是range里面的string 都是xvalue 所以存到sv 02/27 19:00
40F:→ lovejomi: 里面的之後都被解构了,会印全5也只是刚好值还在? 02/27 19:00
41F:→ lovejomi: 至於为啥address都一样 可否推测string对於短字串实作是 02/27 19:05
42F:→ lovejomi: 用stack不会allocate heap所以位址都一样(stack上的位 02/27 19:05
43F:→ lovejomi: 址) 02/27 19:05