teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

refinement

2018/10/13 16:10

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -13,9 +13,9 @@
13
13
 
14
14
  ----
15
15
 
16
- 戻り値型`auto&`の場合、`const int&`型の式からは`const int&`が推論され、`int&`型の式からは`int&`が推論されます。`auto&`をテンプレートパラメータ`T&`と読み替えた場合、`T==int`に推論されています。
16
+ 戻り値型`auto&`の場合、`const int&`型の式からは`const int&`が推論され、`int&`型の式からは`int&`が推論されます。`auto&`をテンプレートパラメータ`T&`と読み替えた場合、`T`はそれぞれ`const int`, `int`に推論されています。
17
17
 
18
- 戻り値型`auto&&`の場合、`const int&`型の式からは`const int&`が推論され、`int&`型の式からは`int&`が推論されます。`auto&&`をテンプレートパラメータ`T&&`と読み替えた場合、`T==int&`に推論されています(これがいわゆるForwarding Reference/Universal Referenceです)。ただし`int&`+`&&`はReference Collapsingルールにより`int&`となるため、最終的には前述のように左辺値参照型となります。(`const int&&`,`int&&`のような右辺値参照型には推論されない)
18
+ 戻り値型`auto&&`の場合、`const int&`型の式からは`const int&`が推論され、`int&`型の式からは`int&`が推論されます。`auto&&`をテンプレートパラメータ`T&&`と読み替えた場合、`T`はそれぞれ`const int&`, `int&`に推論されています(これがいわゆるForwarding Reference/Universal Referenceです)。ただし`(const) int&`+`&&`はReference Collapsingルールにより`(const) int&`となるため、最終的には前述のように左辺値参照型となります。(`const int&&`,`int&&`のような右辺値参照型には推論されない)
19
19
 
20
20
  戻り値型`decltype(auto)`の場合、戻り値型は`delctype(c[???])`と推論されるルールです。よって`const int&`型の式からは`const int&`が推論され、`int&`型の式からは`int&`が推論されます。
21
21
 

4

appendix

2018/10/13 16:10

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -17,4 +17,6 @@
17
17
 
18
18
  戻り値型`auto&&`の場合、`const int&`型の式からは`const int&`が推論され、`int&`型の式からは`int&`が推論されます。`auto&&`をテンプレートパラメータ`T&&`と読み替えた場合、`T==int&`に推論されています(これがいわゆるForwarding Reference/Universal Referenceです)。ただし`int&`+`&&`はReference Collapsingルールにより`int&`となるため、最終的には前述のように左辺値参照型となります。(`const int&&`,`int&&`のような右辺値参照型には推論されない)
19
19
 
20
- 戻り値型`decltype(auto)`の場合、戻り値型は`delctype(c[???])`と推論されるルールです。よって`const int&`型の式からは`const int&`が推論され、`int&`型の式からは`int&`が推論されます。
20
+ 戻り値型`decltype(auto)`の場合、戻り値型は`delctype(c[???])`と推論されるルールです。よって`const int&`型の式からは`const int&`が推論され、`int&`型の式からは`int&`が推論されます。
21
+
22
+ おまけ:戻り値型`auto`の場合、`const int&`, `int&`型の式いずれからも`int`が推論されます。(トップレベルのcv修飾は引き継がれず、前者も単に`int`となります。)

3

refinement

2018/10/13 15:49

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -1,4 +1,4 @@
1
- 説明のため、本題に影響しない部分を???で置き換えます。
1
+ 説明のため、本題に影響しない部分を???で置き換えます。また表記簡略化のため以下`std::`も省略します。
2
2
 
3
3
  ```C++
4
4
  template<typename Container>
@@ -7,7 +7,7 @@
7
7
  }
8
8
  ```
9
9
 
10
- main関数では関数テンプレート`SelectElementry`に左辺値(`a`,`b`)を渡していますから、テンプレートパラメータ`Container`はそれぞれ`const std::vector<int>&`, `std::vector<int>&`に推論されます。return文の式`c[???]`はそれぞれ`std::vector<int>::operator[]() const`, `std::vector<int>::operator[]()`を呼び出します。つまり式`c[???]`の型はそれぞれ`std::vector<int>::const_reference`==`const int&`, `std::vector<int>::reference`==`int&`となっています。
10
+ main関数では関数テンプレート`SelectElementry`に左辺値(`a`,`b`)を渡していますから、テンプレートパラメータ`Container`はそれぞれ`const vector<int>&`, `vector<int>&`に推論されます。return文の式`c[???]`はそれぞれ`vector<int>::operator[]() const`, `vector<int>::operator[]()`を呼び出します。つまり式`c[???]`の型はそれぞれ`vector<int>::const_reference`==`const int&`, `vector<int>::reference`==`int&`となっています。
11
11
 
12
12
  (下準備ここまで)
13
13
 

2

refinement

2018/10/13 15:47

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -13,8 +13,8 @@
13
13
 
14
14
  ----
15
15
 
16
- 戻り値型`auto&`の場合、`const int&`からは`const int&`が推論され、`int&`からは`int&`が推論されます。`auto&`をテンプレートパラメータ`T&`と読み替えた場合、`T==int`に推論されています。
16
+ 戻り値型`auto&`の場合、`const int&`型の式からは`const int&`が推論され、`int&`型の式からは`int&`が推論されます。`auto&`をテンプレートパラメータ`T&`と読み替えた場合、`T==int`に推論されています。
17
17
 
18
- 戻り値型`auto&&`の場合、`const int&`からは`const int&`が推論され、`int&`からは`int&`が推論されます。`auto&&`をテンプレートパラメータ`T&&`と読み替えた場合、`T==int&`に推論されています(これがいわゆるForwarding Reference/Universal Referenceです)。ただし`int&`+`&&`はReference Collapsingルールにより`int&`となるため、最終的には前述のように左辺値参照となります。(`const int&&`,`int&&`のような右辺値参照型には推論されない)
18
+ 戻り値型`auto&&`の場合、`const int&`型の式からは`const int&`が推論され、`int&`型の式からは`int&`が推論されます。`auto&&`をテンプレートパラメータ`T&&`と読み替えた場合、`T==int&`に推論されています(これがいわゆるForwarding Reference/Universal Referenceです)。ただし`int&`+`&&`はReference Collapsingルールにより`int&`となるため、最終的には前述のように左辺値参照となります。(`const int&&`,`int&&`のような右辺値参照型には推論されない)
19
19
 
20
- 戻り値型`decltype(auto)`の場合、戻り値型は`delctype(c[???])`と推論されるルールです。よって`const int&`からは`const int&`が推論され、`int&`からは`int&`が推論されます。
20
+ 戻り値型`decltype(auto)`の場合、戻り値型は`delctype(c[???])`と推論されるルールです。よって`const int&`型の式からは`const int&`が推論され、`int&`型の式からは`int&`が推論されます。

1

update

2018/10/13 15:39

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -1,3 +1,5 @@
1
+ 説明のため、本題に影響しない部分を???で置き換えます。
2
+
1
3
  ```C++
2
4
  template<typename Container>
3
5
  ??? SelectElementry(Container&& c) {