Visual Studio 2013 'explícito' error de palabra clave?

Considere el siguiente programa:

#include <iostream>

class A
{
public:
  A( ) { std::cout << "A()\n"; }

  A( A& ) = delete;

  A( int i ) { std::cout << "A( " << i << " )\n"; }

  explicit operator int( ) { std::cout << "operator int()\n"; return 42; }
};

template< typename T = A > void f( T a = A() ) {}

int main( void )
{
  f();
  return 0;
}

Visual Studio 2013 compila este código y se ejecuta, con salida

A()
operator int()
A( 42 )

¿Es este un error de compilación? Parece que el compilador de VS no tiene en cuenta la palabra clave "explícita" en este contexto. Por lo que yo entiendo, VS 2013 utiliza incorrectamente el operador int () en combinación con A (int) para ordenar 'construir-copiar' A como el parámetro predeterminado para f.

Ambos añadiendo

A a;
A a1( a );

a main y declarando f as

void f( A a = A() ) {}

no compila, VS se queja de que A (A &) se ha eliminado, lo que parece ser el comportamiento correcto. Solo en el contexto del parámetro predeterminado de la plantilla de función, la combinación del operador int () y A (int) parece funcionar como una sustitución de A (A &).

g ++ 4.7.3 no compila el código y se queja:

main.cpp: In function ‘int main()’:
main.cpp:21:7: error: no matching function for call to ‘A::A(A)’
main.cpp:21:7: note: candidates are:
main.cpp:10:3: note: A::A(int)
main.cpp:10:3: note:   no known conversion for argument 1 from ‘A’ to ‘int’
main.cpp:6:3: note: A::A()
main.cpp:6:3: note:   candidate expects 0 arguments, 1 provided

Eliminar "explícito" hace que g ++ compile el código y la salida sea la misma.

Respuestas a la pregunta(2)

Su respuesta a la pregunta