www tuto try tipos static_cast que dev casteo cast c++ casting operators operator-overloading

tuto - try on c++



¿Por qué el "operador void" no se invoca con sintaxis de molde? (1)

La razón técnica por la cual se encuentra en §12.3.2:

Una función de conversión nunca se usa para convertir un objeto (posiblemente calificado para CV) al mismo tipo de objeto (o una referencia a él) (posiblemente cv calificado), a una clase base (posiblemente cv-calificada) de ese tipo (o una referencia a él), o a (posiblemente calificado por CV) vacío .

El razonamiento es (probable) que permita que §5.2.9 / 4 funcione:

Cualquier expresión se puede convertir explícitamente para escribir "cv void". El valor de la expresión se descarta.

(void)expr para suponer que no se hará nada por el valor resultante de ninguna expresión, pero si llamara a su operador de conversión no descartaría nada. Por lo tanto, prohíben el uso del operator void del operator void en las conversiones.

¿Por qué no hacerlo mal formado para que la conversion-type-id sea void ? Quién sabe, pero ten en cuenta que no es totalmente inútil:

struct foo { operator void() { std::cout << "huh?" << std::endl; } }; typedef void (foo::*void_function)(); foo f; void_function func = &foo::operator void; (f.*func)(); // prints "huh" f.operator void(); // also does (which you knew)

Todavía es técnicamente útil para algo , así que quizás esa sea la razón suficiente para no hacerlo mal formado.

Mientras jugaba con esta respuesta del usuario GMan , diseñé el siguiente fragmento (compilado con Visual C ++ 9):

class Class { public: operator void() {} }; Class object; static_cast<void>( object ); (void)object; object.operator void();

después de dar un paso con el depurador descubrí que la conversión a void no invoca Class::operator void() , solo la tercera invocación (con invocación explícita del operador) invoca realmente al operador, los dos moldes simplemente no hacen nada.

¿Por qué el operator void no se invoca con la sintaxis emitida?