さかなソフトブログ

プログラミングやソフトウェア開発に関する情報

プログラミング

Lambda引数にautoを使ったらC++14だったのでこの機会にC++11からバージョンアップする

更新日:

C++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で使えるようになりました^^

正方形336

正方形336

-プログラミング
-

Copyright© さかなソフトブログ , 2019 All Rights Reserved.