Следующий код прекрасно компилируется с обоими gcc 7.2.0 а также лязг 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)
нормально с неполным типом.
Что, если
stru
перегруженoperator&()
?
Тогда не определено, будет ли вызвана перегрузка (стандартную цитату см. В комментарии Олива).
Как мог унарный оператор & не требует полного типа?
Вот как стандарт определил язык. Встроенному оператору address-of не нужно знать определение типа, так как это не влияет на то, где можно получить адрес объекта.
Одно соображение, почему это хорошо: совместимость с C.
Других решений пока нет …