回答編集履歴

1

appendix

2019/12/25 07:15

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -35,3 +35,35 @@
35
35
  ```
36
36
 
37
37
  `auto&`は左辺値参照型へと推論されます。ここでは`vector<string>&`に推論されます。
38
+
39
+
40
+
41
+ ---
42
+
43
+
44
+
45
+ 本質問の発端になっていると邪推しますが、下記`auto&&`はその見た目に反して **右辺値参照型に推論されていません**。
46
+
47
+
48
+
49
+ ```C++
50
+
51
+ auto && ad1 = f(vec);
52
+
53
+ ```
54
+
55
+
56
+
57
+ この`auto&&`表記やテンプレート型パラメータ`T`を用いた`T&&`表記では、[Forwarding Reference](https://timsong-cpp.github.io/cppwp/n4659/temp.deduct#call-3) (俗称:[Universal Reference](https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers))と呼ばれる特殊な型推論が行われます。
58
+
59
+
60
+
61
+ 型推論プロセスは次の通りです:
62
+
63
+ - `auto&&`は型パラメータ`T`を用いた`T&&`と同義です。
64
+
65
+ - 型パラメータ`T`は左辺値参照型`vector<string>&`に推論されます。
66
+
67
+ - `T&&`はいったん`vector<string>& &&`(左辺値参照型への右辺値参照型)と解釈されます。
68
+
69
+ - [Reference collapsing](https://timsong-cpp.github.io/cppwp/n4659/dcl.ref#6)とよばれるC++規則により、最終的には左辺値参照型`vector<string>&`となります。