Linux/Windows/macOSの3OSをターゲットとするC++プロジェクトを開発しているのですが、Google Testのテストコードを特に意識せずに以下の様なコードをVisual Studio 2017上で記述してました。
auto values = {1,2,3,4,5};
ASSERT_TRUE(std::find_if(values.begin(), values.end(),
[](auto value) { return value == 3; }) != values.end());
それで、ビルド通してテスト実行してオールグリーンでよしっということでコミットしてpul-reqを送ってレビューして貰うと「Linuxでビルドが通らない」とのこと。え、なんで?コンパイルエラーログ見ると、「auto valueがC++11ではない」とのこと。え?そうなんだということで調べてみるとラムダ引数にautoを使うのはジェネリックラムダ(generic lambdas)というらしく、C++14の仕様だという事が発覚しました。え、そうなんだ・・・直感的に記述したらこうなったから、なら、これを機会にC++14に統一出来るか?と調べたらコンパイラの実装状況を見るとLinux/Windows/macOSとも実装完了しているとのことであっさり出来ました。以下は各指定方法です。
Linux
gcc 4.9以降で有効で最近のUbuntu等を使っていると5.x以降。コンパイルオプションをc++14に指定する
-std=c++14
Windows(VC++)
Visual Sudio 2015以降であればジェネリックラムダ含むC++14の仕様の一部が、2017以降であれば殆どが実装されている。デフォルトで有効。
macOS(Clang)
Clang 3.4以降であればジェネリックラムダに対応しているらしいがXCode 4.4でClang4.0なのでとうの昔に使えたらしい。XCode9.2だとデフォルトでgnu++14で使えるがGNU拡張仕様はクロスプラットフォーム的には余り好ましくないのでc++14に指定する
これで無事にC++14が3つのOSで使えるようになりました^^