c++23の模範的なHelloWorld

```cpp:hello.cpp
// g++ -std=c++20 -fmodules-ts hello.cpp -o hello.exe -x c++-system-header iostream -Wall -Wextra -Werror -pedantic -O3

import <iostream>;

int main( ) {
  std::cout << "Hello world！" << std::endl;
  return 0;
}

// 今からc++するなら最初のコードはこれであるべき
```

# 前置き
# 2023/4/22
twitterに上げたやつを軽く手直し＋簡単な説明
※g++のバージョンは最新にしましょう

# 2023/6/13
そういえば、std::printが追加されるとかいう話を風のうわさで聞きました

# 説明
## コンパイルのオプション
- -std=c++20
    c++20を指定

- -fmodules-ts
    モジュールを使えるようにするやつ

https://github.com/cplusplus/modules-ts

- hello.cpp
    対象指定

- -o hello.exe
    出力ファイル名

- -x c++-system-header iostream
    g++ -x c++-system-header <system_header_file>
    って感じでコンパイルするやつ

- -Wall -Wextra -Werror
    警告を有効＋さらなる警告を有効＋警告をエラーとして扱う

- -pedantic
    言語規格に厳密に従う
    C++規格で許容されていない機能を使用できなくする
- -O3
    最適化、レベル3
    インライン関数の展開を有効化など
    ※IDEのデバッガなどがブレークポイントを設定できなかったりするため、最適化しない限りインライン関数は展開されない
    また、似たものとして
    - -funroll-loops
        ループを展開
    - -finline-functions
        インライン関数を展開

    がある。

## 本文
- import <iostream>;
    c++20で追加された
    インクルードの順番でコンパイルできないなんてことがなくなる

- std::cout << "Hello world！" << std::endl;
    全角のエクスクラメーションマークを使っている
    これで文字化けして出力されるようなら君のwindowsのコンソールはutf8になっていない
    下記でも参考にして変えよう

https://pystyle.info/vscode-change-default-encoding-of-terminal-to-utf8/

- return 0;
    実行が正常に終了したことを示している。

# よくある1~1000の素数を出力するやつをいい感じにしたかった
※c++23のものを使ったせいか、そもそもまだ登録されていない関数っぽいものがあり、コンパイルできないです。clangはよくわかりませんでした

※途中で力尽きたので素数を生成しません

```cpp:PrimeNumber.cpp
// ヘッダーユニットをコンパイル
// g++ -fmodules-ts -std=c++23 -x c++-system-header ranges
// g++ -fmodules-ts -std=c++23 -x c++-system-header iostream
// g++ -fmodules-ts -std=c++23 -x c++-system-header vector
// g++ -fmodules-ts -std=c++23 -x c++-system-header iterator
// g++ -fmodules-ts -std=c++23 -x c++-system-header algorithm
// g++ -fmodules-ts -std=c++23 -x c++-system-header bitset
// g++ -fmodules-ts -std=c++23 -x c++-system-header string_view
// // g++ -fmodules-ts -std=c++23 -x c++-system-header concepts
// g++ -std=c++23 -fmodules-ts PrimeNumber.cpp -o PrimeNumber.exe -Wall -Wextra -Werror -pedantic -O3

// clang -fmodules-ts --precompile -std=c++23 -x c++-system-header ranges
// clang -fmodules-ts --precompile -std=c++23 -x c++-system-header iostream
// clang -fmodules-ts --precompile -std=c++23 -x c++-system-header vector
// clang -fmodules-ts --precompile -std=c++23 -x c++-system-header iterator
// clang -fmodules-ts --precompile -std=c++23 -x c++-system-header algorithm
// clang -fmodules-ts --precompile -std=c++23 -x c++-system-header bitset
// clang -fmodules-ts --precompile -std=c++23 -x c++-system-header string_view
// // clang -fmodules-ts --precompile -std=c++23 -x c++-system-header concepts
// clang -std=c++2b -fmodules-ts PrimeNumber.cpp -o PrimeNumber.exe -Wall -Wextra -Werror -pedantic -O3 # import先が認識されない

import <iostream>;
import <ranges>;
import <vector>;
import <iterator>;
import <algorithm>;
import <bitset>;
import <string_view>;
// import <concepts>;

int main( ) {
  const int      n = 1'000;
  std::bitset<n> is_prime;

  std::fill_n(is_prime[0], is_prime.size( ), 1);

  for (constexpr auto elem : std::views::iota(0, is_prime.size( )) | std::views::stride(3)) {
    is_prime.set(elem, false);
  };

  // // Use C++23's std::ranges::subrange with std::ranges::views::filter
  auto primes_range = std::ranges::subrange(std::views::iota(0, is_prime.size( )) | std::ranges::views::filter([](bool b) {
                                              return b;
                                            }));

  std::cout << "There are primes from 1 to 1,000:" << std::endl;
  for (const auto [index, number] : std::numbers | std::views::enumerate) {
    if (is_prime[number]) {
      std::cout << "Prime number #" << index + 1 << ": " << number << std::endl;
    }
  }
  return 0;
}
```

# 参考
※全部ではないです

https://stackoverflow.com/questions/69346372/g-11-2-0-failed-to-read-compiled-module-bad-file-data

https://stackoverflow.com/questions/74657339/what-is-stdviewscounted

https://cpprefjp.github.io/reference/algorithm/transform.html

https://en.cppreference.com/w/cpp/algorithm/transform

https://cplusplus.com/reference/algorithm/

https://learn.microsoft.com/ja-jp/cpp/cpp/tutorial-import-stl-named-module?view=msvc-170

https://cpprefjp.github.io/lang/cpp20/modules.html

https://cpprefjp.github.io/reference/algorithm/transform.html

https://cpprefjp.github.io/reference/bitset/bitset.html

https://marycore.jp/prog/cpp/range-based-for-vs-for-each/

https://programming-place.net/ppp/contents/cpp/library/013.html

https://cpprefjp.github.io/reference/ranges.html

https://en.cppreference.com/w/cpp/ranges/stride_view

https://en.cppreference.com/w/cpp/ranges/stride_view/stride

https://en.cppreference.com/w/cpp/ranges

https://en.cppreference.com/w/cpp/concepts/integral


# AI補助

他に普段は使用しているものもありますが、今回使ったのはこれだけでｓ

bingai

https://chat.openai.com/

https://huggingface.co/spaces/kunishou/Rapid-GPT

https://play.vercel.ai/