Gnu C ++ macro __cplusplus estándar conforme?

El compilador Gnu C ++ parece definir__cplusplus ser1

#include <iostream> 
int main() {
  std::cout << __cplusplus << std::endl;
}

Esto imprime1 con gcc en modo c ++ estándar, así como en modo C ++ 0x, congcc 4.3.4 y gcc 4.7.0.

El C ++ 11 FDIS dice en "16.8 Nombres de macro predefinidos [cpp.predefined]" es

El nombre__cplusplus se define comovalue 201103L al compilar una unidad de traducción de C ++. (Nota al pie: se pretende que las versiones futuras de este estándar reemplacen el valor de esta macro con un valor mayor. Los compiladores no conformes deben usar un valor con un máximo de cinco dígitos decimales).

El viejo estándar C ++ 03 tenía una regla similar.

¿El CCG establece esto deliberadamente en1, porque es "no conforme"?

Al leer esa lista, pensé que podría usar__cplusplus para comprobar de forma portátil si tengo un compilador habilitado para C ++ 11. Pero cong ++ Parece que esto no funciona. Sé sobre el...EXPERIMENTAL... macro, pero tengo curiosidad por quég ++ está definiendo__cplusplus de esta manera

Mi problema original era cambiar entre diferentes variantes de puntero nulo. Algo como esto

#if __cplusplus > 201100L
#  define MYNULL nullptr
#else
#  define MYNULL NULL
#endif

Existe una forma simple y razonablemente portátil de implementar dicho interruptor?

Respuestas a la pregunta(3)

Su respuesta a la pregunta