う、>>27のやつ、よく見たら要らなさそうな謎のコードが出てる。
なので「コードは期待通り」ってのを撤回です。
そんなわけでやっぱり素直にループまわした方がいいみたいです。
unsigned count_empty( const std::vector<std::string>& v )
{
  unsigned c = 0;
  std::vector<std::string>::const_iterator const end = v.end();
  for( std::vector<std::string>::const_iterator cur = v.begin() ; cur != end ; ++cur )
    if( cur->empty() )
      ++c;
  return c;
}