Почему унарный оператор & не требует полного типа?

Следующий код компилируется как с gcc 7.2.0, так и с clang 6.0.0.

#include <iostream>

struct stru;

void func(stru& s) {
  std::cout << &s << std::endl;
}

int main() {

}

Мне интересно, как все в порядке. Что, если stru перегрузил operator&()? Компилятор не должен указывать с помощью простого прямого объявления, такого как struct stru. На мой взгляд, только std::addressof(s) в порядке с неполным типом.

Ответ 1

Что, если stru перегрузил operator&()?

Тогда неуказано, будет ли вызвана перегрузка (см. Комментарий Олива для стандартной цитаты).

Как унарный оператор и не требует полного типа?

Это как стандарт определил язык. Встроенный адрес-оператор не должен знать определение типа, поскольку это не влияет на то, где получить адрес объекта.

Одно соображение, почему это хорошо: Совместимость с C.