回答編集履歴
1
間違いを修正
answer
CHANGED
@@ -4,34 +4,16 @@
|
|
4
4
|
* 配列なので、その値を出力したら先頭アドレスになります。
|
5
5
|
* typeid(mat).name() で確認しましたが、どちらの場合もたしかに int[Y][X] になっていました。
|
6
6
|
|
7
|
-
以下の関数は、第2引数は配列の参照となっていますが、これは C++ で禁止されているはずです。
|
7
|
+
~~以下の関数は、第2引数は配列の参照となっていますが、これは C++ で禁止されているはずです。
|
8
|
-
|
8
|
+
なので、エイリアステンプレートを使ったときに、コンパイルエラーにならずにビルドでき、さらにその関数が呼ばれるほうが不思議です。~~
|
9
9
|
```
|
10
10
|
std::ostream &operator<<(std::ostream &os, const matrix<T, Y, X> &mat)
|
11
11
|
```
|
12
12
|
|
13
|
-
```
|
14
|
-
|
13
|
+
これは間違いだったため、訂正します。
|
15
|
-
|
14
|
+
参照の配列は禁止されているが、配列の参照は合法でした。
|
16
|
-
```
|
17
15
|
|
18
|
-
|
16
|
+
----
|
19
17
|
|
20
|
-
```
|
21
|
-
std::ostream &operator<<(std::ostream &os, const T &mat[Y][X])
|
22
|
-
```
|
23
|
-
|
24
|
-
```
|
25
|
-
|
18
|
+
EnumHack さんの解説を見ましたが、そういう背景があったのですね。
|
26
|
-
```
|
27
|
-
|
28
|
-
なので、エイリアステンプレートを使ったときに、コンパイルエラーにならずにビルドでき、さらにその関数が呼ばれるほうが不思議です。
|
29
|
-
|
30
|
-
|
31
|
-
試しに第2引数の参照をはずしたところ、どちらの場合も配列のアドレスが表示されるようになりました。
|
32
|
-
|
33
|
-
```
|
34
|
-
std::ostream &operator<<(std::ostream &os, const T mat[Y][X])
|
35
|
-
```
|
36
|
-
|
37
|
-
|
19
|
+
ADL も今回知ったのですが、C++ は奥が深いです。
|