Visual Studioでstd::min()/std::max()がエラーになるときの回避策

C++11からstd::minとstd::maxは複数の引数を受け取ることができるようになりました。

#include <algorithm>

int i = std::min({1, 2, 3, 4});

ところが、Visual Studioで上記のコードを実行するとコンパイルエラーになります。

原因は、windows.hにmin/maxのマクロが定義されているため。

マイクロソフトのページにある解決策は、「NOMINMAXのプリプロセッサシンボルを定義します。」とあります。
しかし、それができない状況もあります。

他の回避策が「windows.hのmin/maxマクロ回避策4パターン – yohhoyの日記」に紹介されていました。

(std::min)(…)や(std::max)(…)のように、括弧で囲みマクロ展開を抑止することで問題を回避できます。

#include <algorithm>

int i = (std::min)({1, 2, 3, 4});

これでエラーにならなくなりました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください