Почему унарный оператор & не требует полного типа?
Следующий код компилируется как с 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.