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

回答編集履歴

1

間違いを修正

2018/09/21 03:01

投稿

tiitoi
tiitoi

スコア21960

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
- C++ Standard 8.3.2
13
+ これは間違いだったため、訂正します。
15
- There shall be no references to references, no arrays of references, and no pointers to references.
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
- C2234: 'mat': 参照配列は宣言できせん
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++ は奥いです。