Sì, è intenzionale e la possibilità di rottura se operator&
è sovraccaricata è nota.
Prendere l'indirizzo di tipi incompleti è stato possibile da molto prima del C++. In C, non c'è assolutamente alcun rischio di rottura, perché &
non può essere sovraccaricato.
C++ ha scelto di non interrompere inutilmente i programmi precedentemente validi e ha semplicemente specificato che se un tipo incompleto risulta avere un operatore sovraccarico &
, non è specificato se viene utilizzato l'operatore sovraccarico.
N4140 quotazioni:
5.3.1 operatori unari [expr.unary.op]
Se &
viene applicato ad un lvalue di tipo classe incompleta e il tipo completo dichiara operator&()
, essa non è specificato se l'operatore ha il significato incorporato o se viene richiamata la funzione dell'operatore.
Questo può essere interpretato da applicare anche a una classe in fase di dichiarata, e anche quando la dichiarazione di operator&
è già stato visto:
extern struct A a;
struct A {
int operator&();
decltype(&a) m; // int, or A *?
};
int main() {
return A().m; // only valid if m is int
}
Qui, GCC dà m
tipo A *
e respinge il programma , ma clang gli dà tipo int
e lo accetta.
Penso che la domanda migliore sia "perché C++ consente l'overloading di' & 'in primo luogo": D –
Non avevo idea di poter sovraccaricare l'operatore '&()'. A volte penso che il C++ permetta agli sviluppatori di * troppo *. – tenfour
@tenfour: posso letteralmente pensare a una sola situazione in cui è utile, e cioè quando * rappresenta * l'operazione -di operazione in notazione lambda, ad es. 'Foo [& _ 1]'. – Mehrdad