2008-10-06 13 views
22

De forma predeterminada, en C++, se puede usar un constructor de argumento único como operador de conversión implícito. Esto se puede suprimir marcando el constructor como explícito.¿Forzar a los constructores de argumento único a ser explícitos en C++?

Prefiero hacer que "explícito" sea el valor predeterminado, de modo que el compilador no pueda usar silenciosamente estos constructores para la conversión.

¿Hay alguna manera de hacer esto en el estándar C++? En su defecto, ¿hay algún pragma (o similar) que funcione en Microsoft C++ para hacer esto? ¿Qué pasa con g ++ (no lo usamos, pero podría ser información útil)?

Respuesta

17

No, tienes que hacerlo todo a mano. Es un dolor, pero sin duda debería tener el hábito de hacer que los constructores de argumento único sean explícitos. No puedo imaginar el dolor que tendrías si encontraras una solución y luego tuvieras que portar el código a otra plataforma. Por lo general, debes alejarte de las extensiones de compilador como esta porque harán que el código sea menos portátil.

+1

Para ser sincero, no nos preocupa demasiado la portabilidad; somos una tienda de Windows Eso no implica que no nos importe; significa que, una vez que haya optado por el marco de la GUI de Win32, el soporte de Linux o OSX es académico. –

+1

La portabilidad no es solo un problema de plataforma. Hay otros compiladores disponibles para Windows, ej. Intel, MinGW. También hay compatibilidad con versiones anteriores en las nuevas versiones del compilador de Microsofts. La única garantía que tiene es que el Comité C++ piensa cuidadosamente antes de romper el código C++ existente. –

+0

Solo para aclarar, no estoy sugiriendo que Microsoft rompa el código de la gente sin pensar, sin embargo, tienen presiones diferentes a las del comité de la norma. –

0

Creo que la respuesta es no!

Lo siento, no es una respuesta muy constructiva. ¡Espero que alguien más pueda saber más!

0

No hay tal opción disponible en C++ estándar, y tampoco creo que exista en Visual Studio.

1

Podría ser bastante desagradable para cualquier encabezado que tenga. Como <vector>, o cualquiera de los encabezados de Boost. También causaría bastantes informes de errores falsos. Entonces, no, no espero que un compilador agregue un #pragma así.

1

Si hubiera una opción pragma o de línea de comando que hiciera que los constructores fueran explícitos por defecto, ¿cómo declararía uno que no sea explícito? Tendría que haber otro token o pragma específico del compilador para poder declarar un constructor de conversión implícito.

+1

Me gusta eso. Es una de las armas retóricas de Raymond Chen. "¿Puedo hacer esto o aquello? Bueno, imagina * que podrías *, entonces ..." –

+1

Entiendo lo que dices. Con una opción de línea de comando, esto sería cierto. Con un pragma, puedes apagarlo más tarde. O con MSVC, puede usar las extensiones __pragma o __declspec que podrían estar restringidas a la clase actual (c.f. __declspec (novtable)). –

Cuestiones relacionadas