OpenCV 5.0 対応コンパイラの選定

# はじめに

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">&gt; C++14 is approved as default C++ configuration for 5.0.<br><br>OpenCV 5.0からはC++14対応！（しょぼいコンパイラだとダメになりそう）<a href="https://t.co/mGG3YClsMW">https://t.co/mGG3YClsMW</a></p>&mdash; dandelion (@dandelion1124) <a href="https://twitter.com/dandelion1124/status/1292815034461036546?ref_src=twsrc%5Etfw">August 10, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

な、なんだってーー！！っということで、ちょっとまとめてみる。

# TL;DR

- OpenCV 5を使うには、コンパイラは……
 - GCC 5.1以上にしておこう。GCC 6以上がよい。
 - Intel Compiler 17以上にしておこう。
 - Clang 3.4以上にしておこう。
 - ARM Compiler 6以上にしておこう。
- 一部メモリ確保のC++14提案の実装が無いものも。でも多分動く。

# もうちょっと細かく見る

https://ja.wikipedia.org/wiki/C%2B%2B14

wikipedia記載を引用

> GCC や Clang では -std=c++14 を付けることによりコンパイル可能。
>
>- GCC - 5.1 において、N3664を除くほぼ全ての機能が実験的に実装されている[4] [5]。
- Clang - 3.4 にて全ての機能が実装された[6]。
- Microsoft Visual C++ - VC12 (Visual Studio 2013) および VC14 (Visual Studio 2015) 時点で、C++11 の全機能も実装完了していなかったが、C++14 の一部機能の実装が開始された[7] [8]。VC14.1 (Visual Studio 2017) でN3664を除くC++14の追加機能をすべてサポートした[9]。
- Intel C++ Compiler - バージョン15時点で、一部機能が実装されている[10]。バージョン17でN3664を除く全機能をサポートした。


うん、わからん！！ということで、英語版wikipediaも見てみる。

https://en.wikipedia.org/wiki/C%2B%2B14

wikipedia記載を引用

> Clang finished support for C++14 in 3.4 though under the standard name c++1y, and made C++14 the default C++ standard in Clang 6.[24] GCC finished support for C++14 in GCC 5, and made C++14 the default C++ standard in GCC 6.[25] Microsoft Visual Studio 2017 has implemented "almost all" C++14 features.[26]

ちょっとここまででまとめる。

- Clang 3.4時点で全部サポートしている。
 -  http://clang.llvm.org/cxx_status.html
- Visual Studio 2017のC++がC++14に完全準拠してないような…… 
 - https://devblogs.microsoft.com/cppblog/c17-features-in-vs-2017-3/
 - https://docs.microsoft.com/ja-jp/cpp/overview/visual-cpp-language-conformance?view=vs-2019
- Intel Compilerも入ってない・・・　
 - https://www.isus.jp/products/c-compilers/c14-features-supported-by-intel-c-compiler/
- GCCも完全準拠でない
 - https://gcc.gnu.org/projects/cxx-status.html#cxx14
- C++ Builderのサポート状況は難しい…
 - https://en.wikipedia.org/wiki/C%2B%2BBuilder 

表にするとこんな感じ。

| バージョン | C++14サポート状況 | OpenCV5 サポート |
|:-:|:-:|:-:|
| GCC 4以下 | ほぼ非サポート | |
| GCC 5以上  | ほぼサポート（N3664以外）| OK!(多分) |
| Clang 3.4以上  | Supported  | OK!  |
| VS2013以前 | ほぼサポート無し | |
| VS2015 | 大部分サポート(N3664/N3652/N3653 等非サポート)  |   |
| VS2017 | ほぼサポート（N3664以外） | OK!(多分) |
| Intel Compiler 14以前 | ほぼサポートなし | |
| Intel Compiler 15/16 | 一部サポート | |
| Intel Compiler 17以後 | ほぼサポート（N3364以外） | OK!(多分) |
| ARM DS5以前 | 非サポート |　 |
| ARM Compiler 6 | おそらくサポート(clangベース) | OK!(多分)  |
| C++ Builder XE4 | おそらく非サポート(Clang 3.1 base) | |
| C++ Builder 10 Seattle(23) | おそらく非サポート(Clang 3.3 base)/ iOs向けはサポート?(Clang 3.5) | |

までまとめて、下記サイトを見つけた…

https://cpprefjp.github.io/implementation-status.html#cpp14

# N3664とはなんでしょうかね？

https://www.slideshare.net/kariya_mitsuru/c14-84084931

Page 200

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3664.html

ということで、特定条件を満たした場合に

```c++
a = new OBJ[];
a->b = new OBJ[];
```

という実装でのアロケーションを実装は１つでまとめてもいい、ってことかなー。などと。

ということで、これが無くてもコンパイルはできるはず……。

# まとめ（再掲）

- OpenCV 5を使うには、コンパイラは……
 - GCC 5.1以上にしておこう。GCC 6以上がよい。
 - Intel Compiler 17以上にしておこう。
 - Clang 3.4以上にしておこう。
 - ARM Compiler 6以上にしておこう。
- 一部メモリ確保のC++14提案の実装が無いものも。でも多分動く。

以上です。