回答編集履歴

4

リンク追加

2020/11/24 20:28

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -34,7 +34,7 @@
34
34
 
35
35
  ---
36
36
 
37
- `vector`の`operator[]`は`at()`とは異なり範囲チェックについて規定されておらず、要素数以降にアクセスした場合は未定義動作です。
37
+ `vector`の[`operator[]`](https://cpprefjp.github.io/reference/vector/vector/op_at.html)[`at()`](https://cpprefjp.github.io/reference/vector/vector/at.html)とは異なり範囲チェックについて規定されておらず、要素数以降にアクセスした場合は未定義動作です。
38
38
 
39
39
  VisualC++付属のvector実装ではDebugビルド時には`operator[]`も範囲チェックを行っているため、Debug Assertが表示されます。
40
40
 

3

文言修正

2020/11/24 20:28

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -36,7 +36,7 @@
36
36
 
37
37
  `vector`の`operator[]`は`at()`とは異なり範囲チェックについて規定されておらず、要素数以降にアクセスした場合は未定義動作です。
38
38
 
39
- VisualC++付属の実装ではDebugビルド時には`operator[]`も範囲チェックを行う実装となっているため、Debug Assertが表示されます。
39
+ VisualC++付属のvector実装ではDebugビルド時には`operator[]`も範囲チェックを行っているため、Debug Assertが表示されます。
40
40
 
41
41
  ```C++
42
42
 

2

gccについて追記

2020/11/24 20:17

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -57,3 +57,11 @@
57
57
  }
58
58
 
59
59
  ```
60
+
61
+ ---
62
+
63
+ > ですがjoiのコードテスト(gcc)などで試すと普通に実行できます
64
+
65
+
66
+
67
+ 偶々動いているだけです。

1

範囲チェックについて追記

2020/11/24 20:15

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -29,3 +29,31 @@
29
29
  int Mx = j + v[i + 1]; // iがn-2の時にv[n-1]、つまり範囲外にアクセスしている
30
30
 
31
31
  ```
32
+
33
+
34
+
35
+ ---
36
+
37
+ `vector`の`operator[]`は`at()`とは異なり範囲チェックについて規定されておらず、要素数以降にアクセスした場合は未定義動作です。
38
+
39
+ VisualC++付属の実装ではDebugビルド時には`operator[]`も範囲チェックを行う実装となっているため、Debug Assertが表示されます。
40
+
41
+ ```C++
42
+
43
+ _NODISCARD const _Ty& operator[](const size_type _Pos) const
44
+
45
+ { // subscript nonmutable sequence
46
+
47
+ #if _ITERATOR_DEBUG_LEVEL != 0
48
+
49
+ _STL_VERIFY(_Pos < size(), "vector subscript out of range");
50
+
51
+ #endif /* _ITERATOR_DEBUG_LEVEL != 0 */
52
+
53
+
54
+
55
+ return (this->_Myfirst()[_Pos]);
56
+
57
+ }
58
+
59
+ ```