回答編集履歴
3
refinement
test
CHANGED
@@ -24,4 +24,4 @@
|
|
24
24
|
|
25
25
|
ご指摘通り③-1と③-2はいずれもムーブ処理が行われます。テンプレートパラメータを使わない`std::forward<std::string>(e)`という記述は無用に混乱を招くだけですから、素直に`std::move(e)`と記述するほうが好ましいと思います。
|
26
26
|
|
27
|
-
テンプレート関数`std::forward`の役割は「条件付きムーブ(Conditional Move)」、つまり呼出側の実引数から推論されたテンプレートパラメータに応じてコピー/ムーブ動作を切り替える仕組みです。`std::string`といった具象型を指定する
|
27
|
+
テンプレート関数`std::forward<T>`の役割は「条件付きムーブ(Conditional Move)」、つまり呼出側の実引数から推論されたテンプレートパラメータ`T`に応じてコピー/ムーブ動作を切り替える仕組みです。`T`に`std::string`といった具象型を指定する(Non-Conditional)のであれば、直接的に`std::move`と記述する方がソースコードがシンプルになります。
|
2
update
test
CHANGED
@@ -23,3 +23,5 @@
|
|
23
23
|
> ③ 以下のようなコンストラクタで値をセットした場合、③-1のmoveで左辺値strをコンストラクタ引数nameへmove。③-2でコンストラクタ内の_nameへmove。しているとおも思いますが、なぜmoveではなくfowordを使うのでしょうか?
|
24
24
|
|
25
25
|
ご指摘通り③-1と③-2はいずれもムーブ処理が行われます。テンプレートパラメータを使わない`std::forward<std::string>(e)`という記述は無用に混乱を招くだけですから、素直に`std::move(e)`と記述するほうが好ましいと思います。
|
26
|
+
|
27
|
+
テンプレート関数`std::forward`の役割は「条件付きムーブ(Conditional Move)」、つまり呼出側の実引数から推論されたテンプレートパラメータに応じてコピー/ムーブ動作を切り替える仕組みです。`std::string`といった具象型を指定する(Non-Conditional)のであれば、直接的に`std::move`と記述する方がソースコードがシンプルになります。
|
1
update
test
CHANGED
@@ -2,14 +2,14 @@
|
|
2
2
|
|
3
3
|
はい。右辺値/左辺値という区分は、変数や引数に対してではなく **式(_expression_)** に対して判断されるものです。
|
4
4
|
|
5
|
-
よく混同されていますが「
|
5
|
+
よく混同されていますが「左辺値参照/右辺値参照などの型情報(_Type_)」と「左辺値/右辺値の区分(_Value Category_)」は一義的には独立した概念です。
|
6
6
|
|
7
|
-
引数`_name`を使った式`_name`は、型(Type)が右辺値参照(`std::string&&`)であっても、値の区分(Value Category)としては左辺値になります。
|
7
|
+
引数`_name`を使った式`_name`は、型(Type)が右辺値参照(`std::string&&`)であっても、値の区分(Value Category)としては左辺値(_lvalue_)になります。
|
8
8
|
|
9
9
|
---
|
10
10
|
> ② &参照の引数は、参照元が右辺値の場合、左辺値参照になるのでしょうか?
|
11
11
|
|
12
|
-
仮引数型としての「左辺値参照(`X&`)」「const左辺値参照(`const X&`)」「右辺値参照(`X&&`)」と、呼び出し側で実引数に渡す式の「左辺値」「右辺値」の関係を整理すると、下表のようになります。
|
12
|
+
コンストラクタや関数の仮引数型としての「左辺値参照型(`X&`)」「const左辺値参照型(`const X&`)」「右辺値参照型(`X&&`)」と、呼び出し側で実引数に渡す式の「左辺値」「右辺値」の関係を整理すると、下表のようになります。
|
13
13
|
|
14
14
|
|仮引数の型|左辺値|右辺値|
|
15
15
|
|:--:|:--:|:--:|
|