No consideremos la ética por un momento. Consideremos el estándar.
Lo que está proponiendo hacer es no estándar. Ver la sección 9.2, cláusula 12 de la norma. "El orden de asignación de los miembros no estáticos separados por un especificador de acceso no está especificado". Por lo tanto, si tiene una clase con miembros privados y una estructura sin miembros privados, la norma no garantiza que los miembros estarán en el mismo orden.
Por lo tanto, si su truco funciona, solo funciona por accidente, que los escritores del compilador lo hicieron de esa manera. No hay garantía de que funcione en otro compilador, una versión posterior del mismo compilador o con diferentes diseños de clase.
Sin mencionar que, si no tiene autorización para modificar la clase (por ejemplo, para proporcionar una función de acceso simple), probablemente no tenga autorización para objetar si cambia cualquier detalle de implementación en la clase. (Una de las ideas detrás de lo público y lo privado es distinguir lo que se promete de lo que es libremente modificable). Por lo tanto, el diseño puede cambiar, o el miembro puede llegar a significar algo diferente, o eliminarse del todo.
Herb Sutter escribió a Guru of the Week columna en este tema.
¿En cuanto a la ética? Si realmente, realmente tienes que hacer algo como esto, y no puedes salir de él, documentalo muy cuidadosamente. Si sus estándares de codificación tienen algún tipo de procedimiento para marcar un comportamiento no estándar, úselos. Si no, tenga mucho cuidado de anotarlo de una manera que no se pase por alto cuando algo sale mal.
¿Qué estás tratando de lograr específicamente al hacer esto? –