c++ - sobre - palabras reservadas de visual basic pdf
¿Error de palabra clave ''explícito'' de Visual Studio 2013? (2)
Criado en el foro de VS:
Y lo reportó como un error:
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 esto un error del compilador? Parece que el compilador de VS no presta atención a la palabra clave ''explícita'' en este contexto. Desde mi entender, VS 2013 utiliza erróneamente operator int () en combinación con A (int) para ordenar-de ''copy-construct'' A como el parámetro predeterminado para f.
Ambos añadiendo
A a;
A a1( a );
para main y declarar f como
void f( A a = A() ) {}
no compila, VS se queja de que A (A &) ha sido eliminado, lo que parece ser un comportamiento correcto. Solo en el contexto del parámetro predeterminado de la plantilla de función, la combinación de operador int () y A (int) parece funcionar como una sustitución para 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
Al eliminar ''explicit'', g ++ compila el código y la salida es la misma.
Esto es definitivamente un error en Visual C ++. De acuerdo con el estándar:
12.3.2 Funciones de conversión [class.conv.fct]
2 - Una función de conversión puede ser explícita (7.1.2), en cuyo caso solo se considera una conversión definida por el usuario para la inicialización directa (8.5) en determinados contextos (13.3.1.4, 13.3.1.5, 13.3.1.6) .
y no hay inicialización directa en tu ejemplo.
Otros compiladores de C ++ como GCC y Clang informan un error en este caso.