回答編集履歴

3

refinement

2022/09/29 06:27

投稿

yohhoy
yohhoy

スコア6191

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`といった具象型を指定するNon-Conditionalのであれば、直接的に`std::move`と記述する方がソースコードがシンプルになります。
27
+ テンプレート関数`std::forward<T>`の役割は「条件付きムーブ(Conditional Move)」、つまり呼出側の実引数から推論されたテンプレートパラメータ`T`に応じてコピー/ムーブ動作を切り替える仕組みです。`T`に`std::string`といった具象型を指定する(Non-Conditional)のであれば、直接的に`std::move`と記述する方がソースコードがシンプルになります。

2

update

2022/09/29 06:04

投稿

yohhoy
yohhoy

スコア6191

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

2022/09/29 05:51

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -2,14 +2,14 @@
2
2
 
3
3
  はい。右辺値/左辺値という区分は、変数や引数に対してではなく **式(_expression_)** に対して判断されるものです。
4
4
 
5
- よく混同されていますが「右辺値左辺値/辺値参照などの型情報(_Type_)」と「辺値/辺値の区分(_Value Category_)」は一義的には独立した概念です。
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
  |:--:|:--:|:--:|