回答編集履歴

1

間違いを修正

2018/09/21 03:01

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -10,9 +10,9 @@
10
10
 
11
11
 
12
12
 
13
- 以下の関数は、第2引数は配列の参照となっていますが、これは C++ で禁止されているはずです。
13
+ ~~以下の関数は、第2引数は配列の参照となっていますが、これは C++ で禁止されているはずです。
14
14
 
15
-
15
+ なので、エイリアステンプレートを使ったときに、コンパイルエラーにならずにビルドでき、さらにその関数が呼ばれるほうが不思議です。~~
16
16
 
17
17
  ```
18
18
 
@@ -22,52 +22,16 @@
22
22
 
23
23
 
24
24
 
25
- ```
25
+ これは間違いだったため、訂正します。
26
26
 
27
- C++ Standard 8.3.2
27
+ 参照の配列は禁止されているが、配列の参照は合法でした。
28
-
29
- There shall be no references to references, no arrays of references, and no pointers to references.
30
-
31
- ```
32
28
 
33
29
 
34
30
 
35
- 実際、このように置き換えるとコンパイルエラーになります。
31
+ ----
36
32
 
37
33
 
38
34
 
39
- ```
35
+ EnumHack さんの解説を見ましたが、そういう背景があったのですね。
40
36
 
41
- std::ostream &operator<<(std::ostream &os, const T &mat[Y][X])
42
-
43
- ```
44
-
45
-
46
-
47
- ```
48
-
49
- C2234: 'mat': 参照の配列宣言きません
37
+ ADL も今回知ったのですが、C++奥が深い
50
-
51
- ```
52
-
53
-
54
-
55
- なので、エイリアステンプレートを使ったときに、コンパイルエラーにならずにビルドでき、さらにその関数が呼ばれるほうが不思議です。
56
-
57
-
58
-
59
-
60
-
61
- 試しに第2引数の参照をはずしたところ、どちらの場合も配列のアドレスが表示されるようになりました。
62
-
63
-
64
-
65
- ```
66
-
67
- std::ostream &operator<<(std::ostream &os, const T mat[Y][X])
68
-
69
- ```
70
-
71
-
72
-
73
- なぜこのような現象が起こるのか自分も理解できないので、分かる人がいましたら解説をお願いしたいですね。