GCC does not support strong enum in pre-C++0x mode.

GCC does not support strong enum if -std=c++0x is not used.
Without the strong enum, we will see following error:

  In file included from libcxx/include/ostream:131:0,
                   from libcxx/include/sstream:174,
                   from libcxx/include/complex:247,
                   from cpp03-headers.cpp:11:
  libcxx/include/ios:419:68: error: 'io_errc' is not a class or namespace
  libcxx/include/ios:420:66: error: 'io_errc' is not a class or namespace

To workaround this issue, this commit will define
_LIBCPP_HAS_NO_STRONG_ENUMS when GCC is detected and
-std=c++0x is not given.
Check the support of default function template args.

GCC will generate an error if we uses default function
template arguments in pre-C++0x mode.  Besides,
Clang will generate a warning in pre-C++0x mode (though
it will be hidden by system_header pragma.)
Fix GCC unknown pragma warning.

We should check defined(__clang__) before the usage of the
clang diagnostic pragmas.

The [-Wswitch] warning in src/future.cpp should be ignored.
As the result, the equivalent GCC pragma is added.
Fix std::begin() and std::end() for array type.

The std::begin() and std::end() for array type should not be
guarded with _LIBCXX_HAS_NO_TRAILING_RETURN.

This commit will fix the libc++ compilation for g++ 4.6.