Visual Studio 2013 "explizite" Keyword-Fehler?

Betrachten Sie das folgende Programm:

#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 kompiliert diesen Code und wird mit Ausgabe ausgeführt

A()
operator int()
A( 42 )

Ist das ein Compiler-Fehler? Es sieht so aus, als würde der VS-Compiler das Schlüsselwort 'explicit' in diesem Kontext nicht beachten. Nach meinem Verständnis verwendet VS 2013 fälschlicherweise den Operator int () in Kombination mit A (int), um 'copy-construct' A als Standardparameter für f zu sortieren.

Beides Hinzufügen

A a;
A a1( a );

zu pflegen und zu erklären f als

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

nicht kompiliert, beschwert sich VS, dass A (A &) gelöscht wird, was korrektes Verhalten zu sein scheint. Nur im Kontext des Standardparameters der Funktionsvorlage scheint die Kombination aus Operator int () und A (int) als Ersatz für A (A &) zu funktionieren.

g ++ 4.7.3 kompiliert den Code nicht und beschwert sich:

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

Durch das Entfernen von 'explicit' kompiliert g ++ den Code und die Ausgabe ist dieselbe.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage