c++ - songs - tag del trap
¿Qué reglas especiales se aplican a unario y operador? (1)
¿Hay alguna regla especial que se aplique a unario y operador?
Por ejemplo, el código:
#include <iostream>
struct X
{
X() {}
void* operator &() { return NULL; }
};
int main()
{
const X x;
std::cout << &x << std::endl;
X y;
std::cout << &y;
}
produce la salida
0xbfbccb33
0
Sabía que esto se compilaría y ejecutaría de esta manera debido a una discusión que he tenido aquí antes, pero si no lo hubiera sabido, hubiera esperado que esto no compilara, porque el operator &
no se ha declarado const
.
Así que parece que el compilador genera el operator &() const
independientemente de si el operator &()
está sobrecargado o no. Bien, esto tiene sentido, especialmente con la muestra y la salida.
La pregunta es ¿ dónde se detalla este comportamiento en la norma?
No estoy buscando respuestas que repitan lo que ya dije en la pregunta, así que no explique cómo no se puede llamar a mi operador sobrecargado en un objeto const
, porque ya lo sé.
n3337 13.3.1.2/9
Si el operador es el operador, el operador unario & , o el operador ->, y no hay funciones viables, se asume que el operador es el operador integrado y se interpreta de acuerdo con la Cláusula 5.