Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions .github/workflows/display_error_check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
name: display error check

on: [push, pull_request, workflow_dispatch]

jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install requests
- uses: actions/checkout@v4
- name: check
run: python3 .github/workflows/script/display_error_check.py
57 changes: 57 additions & 0 deletions .github/workflows/script/display_error_check.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import glob
import os
import sys
import re

# consider tab
def indent_length(s: str) -> int:
length = 0
for x in s:
length += 1 if x == " " else 4
return length

def check_item_indent(line: str, line_no: int, filename: str) -> bool:
m = re.match(r'^(\s*?)([0-9] \.\s)', line)
if m:
indent: int = indent_length(m[1])
if indent > 0 and indent % 4 != 0:
print("{}:{}: number item indent {} shoule be 4. line:{}".format(filename, line_no, indent, line))
return False
return True

m = re.match(r'^(\s*?)([+-]\s)', line)
if m:
indent: int = indent_length(m[1])
if indent > 0 and indent % 4 != 0:
print("{}:{}: item indent {} shoule be 4. line:{}".format(filename, line_no, indent, line))
return False
return True

def check_display_error(text: str, filename: str) -> bool:
found_error: bool = False
in_code_block: bool = False

for i, line in enumerate(text.split("\n")):
is_code_block = line.strip().startswith("```")
if is_code_block:
in_code_block = not in_code_block
continue
if in_code_block:
continue

if not check_item_indent(line, i + 1, filename):
found_error = True

return not found_error

if __name__ == '__main__':
found_error = False
for p in sorted(list(glob.glob("**/*.md", recursive=True))):
with open(p) as f:
text = f.read()

if not check_display_error(text, p):
found_error = True

if found_error:
sys.exit(1)
4 changes: 2 additions & 2 deletions lang/cpp11/static_assert.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ static_assert(定数式, 文字列リテラル);
- 定数式が真であると評価された場合は何も効果がない。定数式が偽であると評価された場合は、指定された文字列リテラルを含む診断メッセージがコンパイラによって問題報告される。ただし、基本ソース文字集合に含まれない文字集合は、診断メッセージに表示することはコンパイラに要求されない
- `static_assert`宣言では、新たな型やオブジェクトは宣言しない。また、実行時にサイズや時間コストは発生しない
- (CWG 2518が適用された環境): template文(もしくは適切な特殊化や[C++17 constexpr if 文](/lang/cpp17/if_constexpr.md)の中の文)が実際にインスタンス化されるまで、`static_assert`文の宣言は遅延される。
- [C++17 constexpr if 文](/lang/cpp17/if_constexpr.md)の解説を参照
- [C++17 constexpr if 文](/lang/cpp17/if_constexpr.md)の解説を参照

## 例
```cpp example
Expand Down Expand Up @@ -99,4 +99,4 @@ Boost Static Assertion Libraryが開発されたときに、コンパイル時
- [N1617 Proposal to Add Static Assertions to the Core Language (Revision 2)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1617.html)
- [N1720 Proposal to Add Static Assertions to the Core Language (Revision 3)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1720.html)
- [P2593R1: Allowing static_assert(false)](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2593r1.html)
- [Issue 2518: Conformance requirements and #error/#warning - WG21 CWG Issues](https://wg21.cmeerw.net/cwg/issue2518)
- [Issue 2518: Conformance requirements and #error/#warning - WG21 CWG Issues](https://wg21.cmeerw.net/cwg/issue2518)
18 changes: 9 additions & 9 deletions lang/cpp17/guaranteed_copy_elision.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,20 +35,20 @@ int k = X().n; // ok, X() prvalue は xvalue に変換される

不必要な一時オブジェクトの作成を避けるために、一時オブジェクトの実体化は一般に可能な限り遅らせる。
注:一時オブジェクトは次のとき実体化されている。
- 参照を`prvalue`にバインドするとき
- クラス`prvalue`でメンバアクセスを実行するとき
- 配列からポインタへの変換を実行するとき、または配列`prvalue`をサブスクライブするとき
- `braced-init-list`から`std::initializer_list<T>`型のオブジェクトを初期化するとき
- 特定の未評価のオペランド、および`prvalue`が廃棄値式(`discarded-value expression`)として現れる場合

- 参照を`prvalue`にバインドするとき
- クラス`prvalue`でメンバアクセスを実行するとき
- 配列からポインタへの変換を実行するとき、または配列`prvalue`をサブスクライブするとき
- `braced-init-list`から`std::initializer_list<T>`型のオブジェクトを初期化するとき
- 特定の未評価のオペランド、および`prvalue`が廃棄値式(`discarded-value expression`)として現れる場合

これより、上の例は「クラス`prvalue`でメンバアクセスを実行するとき」にあたり、`xvalue`として一時オブジェクトを生成している。

また、`prvalue`から`prvalue`への変換は、上記の「一時オブジェクトの実体化は一般に可能な限り遅らせられる」ことより、一時オブジェクトを実体化しない。よって、次の例における`prvalue`の`T`型の戻り値は、呼び出し元の`t`を直接初期化する。

```cpp
T Func() {return T();}
T t = Func(); // 直接初期化
T Func() {return T();}
T t = Func(); // 直接初期化
```

## 例
Expand Down Expand Up @@ -178,4 +178,4 @@ Foo x = foo(); // error Foo型のコピーコンストラクタが必要
- [Guaranteed Copy Elision](https://jonasdevlieghere.com/guaranteed-copy-elision/)

## 注釈
1. **<a id="note-1" href="#note_ref-1">^</a>** <cite>[右辺値、左辺値などの細かい定義 - Qiita](https://qiita.com/rinse_/items/cffa87016b7de49391ae)</cite>を参照
1. **<a id="note-1" href="#note_ref-1">^</a>** <cite>[右辺値、左辺値などの細かい定義 - Qiita](https://qiita.com/rinse_/items/cffa87016b7de49391ae)</cite>を参照
4 changes: 2 additions & 2 deletions lang/cpp23/lifetime_extension_in_range_based_for_loop.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ void foo() {
- この `t` は "一時オブジェクトの寿命が `for-range-initializer` 完全式の終わりではない場合" にも該当すると考えられる
- この `t` は、構文的に見ると `for-range-initializer` の中で生じたとは言えないという意見もある
- "`for-range-initializer` の中" を実行時のことだと解釈すると、そこから呼び出された関数の中なども含むことになるが、それを排除する規定が "一時オブジェクトの寿命が `for-range-initializer` 完全式の終わりではない場合" ではないか
- インライン展開されたときなどに効いてくるのかもしれない
- インライン展開されたときなどに効いてくるのかもしれない

## 検討されたほかの選択肢

Expand All @@ -149,4 +149,4 @@ void foo() {
- [地に足のついた範囲for文 - 地面を見下ろす少年の足蹴にされる私](https://onihusube.hatenablog.com/entry/2022/12/05/000923)
- [範囲for文範囲初期化子内の一時オブジェクト延命の説明見直し
#1246](https://github.com/cpprefjp/site/issues/1246)
- [Are function parameter objects temporary objects?](https://stackoverflow.com/questions/77676199/are-function-parameter-objects-temporary-objects/77676480)
- [Are function parameter objects temporary objects?](https://stackoverflow.com/questions/77676199/are-function-parameter-objects-temporary-objects/77676480)
8 changes: 4 additions & 4 deletions reference/algorithm.md
Original file line number Diff line number Diff line change
Expand Up @@ -273,11 +273,11 @@ ranges::sort(pv, {}, &Person::name);
- `comp(a, b) && comp(b, c)` は `comp(a, c)` を意味する
- `equiv(a, b) && equiv(b, c)` は `equiv(a, c)` を意味する

これらの前提のもと、以下を示すことができる。
これらの前提のもと、以下を示すことができる。

- `equiv` は同値関係 (equivalence relation) である
- `comp` は `equiv` によって決まる同値類 (equivalence class) の間での明確な関係を示す
- その示される関係は狭義の全順序 (strict total ordering) である
- `equiv` は同値関係 (equivalence relation) である
- `comp` は `equiv` によって決まる同値類 (equivalence class) の間での明確な関係を示す
- その示される関係は狭義の全順序 (strict total ordering) である

数学用語の日本語訳として "equivalence relation" には「同値関係」 "equivalence class" には「同値類」が定着しており、同じく数学的な文脈では上記 `equiv` を満たす2つの値を「同値」 (equivalent) であると言う。しかし特に数学的でない文脈で「同値」と言った場合は `operator==` による "equal" の関係と誤解される可能性が高いと考えられるため、本サイトでは上記 `equiv` による "equivalent" の関係を「等価」 `operator==` による "equal" の関係を「等値」として区別する。

Expand Down
6 changes: 3 additions & 3 deletions reference/compare/partial_ordering/op_equal.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@ friend constexpr bool operator==(/*unspecified*/, partial_ordering v) noexcept;
## 備考
この演算子により、以下の演算子が使用可能になる:

- `bool operator!=(partial_ordering v, partial_ordering w) noexcept;`
- `bool operator!=(partial_ordering v, /*unspecified*/) noexcept;`
- `bool operator!=(/*unspecified*/, partial_ordering w) noexcept;`
- `bool operator!=(partial_ordering v, partial_ordering w) noexcept;`
- `bool operator!=(partial_ordering v, /*unspecified*/) noexcept;`
- `bool operator!=(/*unspecified*/, partial_ordering w) noexcept;`

*unspecified*となっている片側の引数には`0`リテラルのみが使用できる。それ以外の物を渡した場合、動作は未定義。

Expand Down
6 changes: 3 additions & 3 deletions reference/compare/strong_ordering/op_equal.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@ friend constexpr bool operator==(/*unspecified*/, strong_ordering v) noexcept;
## 備考
この演算子により、以下の演算子が使用可能になる:

- `bool operator!=(strong_ordering v, strong_ordering w) noexcept;`
- `bool operator!=(strong_ordering v, /*unspecified*/) noexcept;`
- `bool operator!=(/*unspecified*/, strong_ordering w) noexcept;`
- `bool operator!=(strong_ordering v, strong_ordering w) noexcept;`
- `bool operator!=(strong_ordering v, /*unspecified*/) noexcept;`
- `bool operator!=(/*unspecified*/, strong_ordering w) noexcept;`

*unspecified*となっている片側の引数には`0`リテラルのみが使用できる。それ以外の物を渡した場合、動作は未定義。

Expand Down
6 changes: 3 additions & 3 deletions reference/compare/weak_ordering/op_equal.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@ friend constexpr bool operator==(/*unspecified*/, weak_ordering v) noexcept; /
## 備考
この演算子により、以下の演算子が使用可能になる:

- `bool operator!=(weak_ordering v, weak_ordering w) noexcept;`
- `bool operator!=(weak_ordering v, /*unspecified*/) noexcept;`
- `bool operator!=(/*unspecified*/, weak_ordering w) noexcept;`
- `bool operator!=(weak_ordering v, weak_ordering w) noexcept;`
- `bool operator!=(weak_ordering v, /*unspecified*/) noexcept;`
- `bool operator!=(/*unspecified*/, weak_ordering w) noexcept;`

*unspecified*となっている片側の引数には`0`リテラルのみが使用できる。それ以外の物を渡した場合、動作は未定義。

Expand Down
8 changes: 4 additions & 4 deletions reference/concepts/swap.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ namespace std::ranges {
```

2. `a, b`が共に同じ長さの配列型の左辺値であり、`ranges::swap(*a, *b)`が呼び出し可能ならば`ranges::swap_ranges(a, b)`
- 1か3に委譲して要素毎に`swap`される
- 1か3に委譲して要素毎に`swap`される

3. `a, b`が共に同じ型`T`の左辺値であり、`T`と`T&`は[`move_constructible<T>`](move_constructible.md)及び[`assignable_from<T&, T>`](assignable_from.md)のモデルとなる場合、[`std::swap()`](/reference/utility/swap.md)相当の操作によって`a, b`の値を交換する。

Expand All @@ -56,9 +56,9 @@ namespace std::ranges {
1. 呼び出される`swap(a, b)`(及び、もし返されるのならば戻り値のデストラクタ)が定数評価可能であるかに従う。
2. `a, b`の要素型によって、1か3に従う
3. 以下の条件を全て満たす場合に定数評価可能
- `T`はリテラル型である
- `a = std::move(b), b = std::move(a)`は共に定数評価可能
- 次のような初期化式が定数評価可能
- `T`はリテラル型である
- `a = std::move(b), b = std::move(a)`は共に定数評価可能
- 次のような初期化式が定数評価可能
```cpp
T t1(std::move(a));
T t2(std::move(b));
Expand Down
4 changes: 2 additions & 2 deletions reference/functional/copyable_function/op_constructor.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,8 @@ explicit copyable_function(in_place_type_t<T>, initializer_list<U>, Args&&...);
## 効果
- (1), (2) : 関数を持たない空の`copyable_function`オブジェクトを構築する。この方法で構築した後、[`operator bool`](op_bool.md)は`false`を返す。
- (3) : `*this`の格納オブジェクトを
- `f`が値を保持していない場合、値を保持しない。
- そうでなければ、`f`が保持する値をコピーして保持する。
- `f`が値を保持していない場合、値を保持しない。
- そうでなければ、`f`が保持する値をコピーして保持する。
- (4) : `f`が保持する状態を`*this`に移動する。移動された後の`f`は、未規定な値を持つ有効な状態となる。
- (5) : `*this`の格納オブジェクトを
- `f`が関数ポインタ型、メンバ関数ポインタ型、メンバ変数ポインタ型いずれかのヌルポインタ値の場合、値を保持しない。
Expand Down
24 changes: 12 additions & 12 deletions reference/iterator/data.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,18 +34,18 @@ namespace std {
## 備考
- [機能テストマクロ](../../lang/cpp17/feature_test_macros.md)は`__cpp_lib_nonmember_container_access`で値は`201411`
- `<iterator>`ヘッダを読み込む以外では、以下のヘッダが読み込まれている場合に、この関数を使用できる:
- [`<array>`](../array.md)
- [`<deque>`](../deque.md)
- [`<forward_list>`](../forward_list.md)
- [`<list>`](../list.md)
- [`<map>`](../map.md)
- [`<regex>`](../regex.md)
- [`<set>`](../set.md)
- [`<string>`](../string.md)
- [`<string_view>`](../string_view.md) (C++20)
- [`<unordered_map>`](../unordered_map.md)
- [`<unordered_set>`](../unordered_set.md)
- [`<vector>`](../vector.md)
- [`<array>`](../array.md)
- [`<deque>`](../deque.md)
- [`<forward_list>`](../forward_list.md)
- [`<list>`](../list.md)
- [`<map>`](../map.md)
- [`<regex>`](../regex.md)
- [`<set>`](../set.md)
- [`<string>`](../string.md)
- [`<string_view>`](../string_view.md) (C++20)
- [`<unordered_map>`](../unordered_map.md)
- [`<unordered_set>`](../unordered_set.md)
- [`<vector>`](../vector.md)


## 例
Expand Down
24 changes: 12 additions & 12 deletions reference/iterator/empty.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,18 +40,18 @@ namespace std {
## 備考
- [機能テストマクロ](../../lang/cpp17/feature_test_macros.md)は`__cpp_lib_nonmember_container_access`で値は`201411`
- `<iterator>`ヘッダを読み込む以外では、以下のヘッダが読み込まれている場合に、この関数を使用できる:
- [`<array>`](../array.md)
- [`<deque>`](../deque.md)
- [`<forward_list>`](../forward_list.md)
- [`<list>`](../list.md)
- [`<map>`](../map.md)
- [`<regex>`](../regex.md)
- [`<set>`](../set.md)
- [`<string>`](../string.md)
- [`<string_view>`](../string_view.md) (C++20)
- [`<unordered_map>`](../unordered_map.md)
- [`<unordered_set>`](../unordered_set.md)
- [`<vector>`](../vector.md)
- [`<array>`](../array.md)
- [`<deque>`](../deque.md)
- [`<forward_list>`](../forward_list.md)
- [`<list>`](../list.md)
- [`<map>`](../map.md)
- [`<regex>`](../regex.md)
- [`<set>`](../set.md)
- [`<string>`](../string.md)
- [`<string_view>`](../string_view.md) (C++20)
- [`<unordered_map>`](../unordered_map.md)
- [`<unordered_set>`](../unordered_set.md)
- [`<vector>`](../vector.md)


## 例
Expand Down
10 changes: 5 additions & 5 deletions reference/iterator/move_iterator/op_assign.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,12 @@ constexpr move_iterator& operator=(move_iterator&&) = default; // (3) C++17
## テンプレートパラメータ制約

- C++17まで
- (1) : `U`が`Iterator`に変換可能であること
- (1) : `U`が`Iterator`に変換可能であること
- C++20
- (1) : 次の両方を満たす
- `is_same_v<U, Iterator> == false`であること。
- `const U&`が[`convertible_to<Iterator>`](/reference/concepts/convertible_to.md)のモデルとなること。
- `Iterator&, const U&`が[`assignable_from<Iterator&, const U&>`](/reference/concepts/assignable_from.md)のモデルとなること。
- (1) : 次の両方を満たす
- `is_same_v<U, Iterator> == false`であること。
- `const U&`が[`convertible_to<Iterator>`](/reference/concepts/convertible_to.md)のモデルとなること。
- `Iterator&, const U&`が[`assignable_from<Iterator&, const U&>`](/reference/concepts/assignable_from.md)のモデルとなること。


## 例
Expand Down
8 changes: 4 additions & 4 deletions reference/iterator/move_iterator/op_constructor.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,11 @@ constexpr move_iterator(move_iterator&&) noexcept = default; // (4) C++17
## テンプレートパラメータ制約

- C++17まで
- (3) : `U`が`Iterator`に変換可能であること
- (3) : `U`が`Iterator`に変換可能であること
- C++20
- (3) : 次の全てを満たす
- `is_same_v<U, Iterator> == false`であること。
- `const U&, Iterator`が[`convertible_to<Iterator>`](/reference/concepts/convertible_to.md)のモデルとなること。
- (3) : 次の全てを満たす
- `is_same_v<U, Iterator> == false`であること。
- `const U&, Iterator`が[`convertible_to<Iterator>`](/reference/concepts/convertible_to.md)のモデルとなること。

## 例
```cpp example
Expand Down
10 changes: 5 additions & 5 deletions reference/iterator/reverse_iterator/op_assign.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,12 @@ constexpr reverse_iterator& operator=(const reverse_iterator<U>& u); // (
## テンプレートパラメータ制約

- C++17まで
- (2) : `U`が`Iterator`に変換可能であること
- (2) : `U`が`Iterator`に変換可能であること
- C++20
- (2) : 次の両方を満たす
- `is_same_v<U, Iterator> == false`であること。
- `const U&, Iterator`が[`convertible_to<Iterator>`](/reference/concepts/convertible_to.md)のモデルとなること。
- `Iterator&, const U&`が[`assignable_from<Iterator&, const U&>`](/reference/concepts/assignable_from.md)のモデルとなること。
- (2) : 次の両方を満たす
- `is_same_v<U, Iterator> == false`であること。
- `const U&, Iterator`が[`convertible_to<Iterator>`](/reference/concepts/convertible_to.md)のモデルとなること。
- `Iterator&, const U&`が[`assignable_from<Iterator&, const U&>`](/reference/concepts/assignable_from.md)のモデルとなること。


## 戻り値
Expand Down
8 changes: 4 additions & 4 deletions reference/iterator/reverse_iterator/op_constructor.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@ constexpr reverse_iterator(const reverse_iterator<U>& u); // (3) C++17
## テンプレートパラメータ制約

- C++17まで
- (3) : `U`が`Iterator`に変換可能であること
- (3) : `U`が`Iterator`に変換可能であること
- C++20
- (3) : 次の両方を満たす
- `is_same_v<U, Iterator> == false`であること。
- `const U&, Iterator`が[`convertible_to<Iterator>`](/reference/concepts/convertible_to.md)のモデルとなること。
- (3) : 次の両方を満たす
- `is_same_v<U, Iterator> == false`であること。
- `const U&, Iterator`が[`convertible_to<Iterator>`](/reference/concepts/convertible_to.md)のモデルとなること。

## 要件
- (3) : `U`が`Iterator`に変換可能であること
Expand Down
Loading
Loading