マクロの呪いでお先真っ黒

boost_1_34_0のnumeric ublasのソースコードを読んでいると

std::swap_ranges (data_, data_ + (std::max) (size_, a.size_), a.data_);

という感じのstd::maxやstd::minを括弧で囲んだ式をちょくちょく見かける。
それは標準のテンプレート関数なんだけど、なぜこのような変な書き方をしているのだろうか。

そういえば昔、をインクルードするとmin,maxマクロが小文字で定義されていてstd::min, std::maxが使えないという目にあったことがあたった。もしかしてstd::minを括弧で囲むとマクロ展開されないのだろうか。

#include <algorithm>

#define min(a, b) "■■■"

void hoge()
{
	(std::min)(9, 6);
}

cygwinのg++のstl_algobase.hではmin, maxを定義する前にmin, maxを#undefしていた。
min, maxマクロはいろんなところで悪さをしていたのかもしれない。