„Wyraźny” błąd słów kluczowych w Visual Studio 2013?

Rozważmy następujący program:

#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 kompiluje ten kod i uruchamia z danymi wyjściowymi

A()
operator int()
A( 42 )

Czy to błąd kompilatora? Wygląda na to, że kompilator VS nie zwraca uwagi na „jawne” słowo kluczowe w tym kontekście. Z mojego zrozumienia wynika, że ​​VS 2013 błędnie używa operatora int () w połączeniu z A (int) do sortowania „copy-construct” A jako domyślnego parametru f.

Oba dodają

A a;
A a1( a );

do głównej i deklarującej f jako

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

nie kompiluje, VS skarży się, że A (A &) jest usuwany, co wydaje się być poprawnym zachowaniem. Tylko w kontekście domyślnego parametru szablonu funkcji kombinacja operatora int () i A (int) wydaje się działać jako podstawienie dla A (A i).

g ++ 4.7.3 nie kompiluje kodu i narzeka:

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

Usunięcie „jawnego” sprawia, że ​​g ++ kompiluje kod, a wynik jest taki sam.

questionAnswers(2)

yourAnswerToTheQuestion