Во время игры с указателями на участника я столкнулся с поведением, которое кажется мне немного противоречивым и несколько противоречивым.Рассмотрим следующую фиктивную структуру:
struct foo {
int x;
double d;
};
и следующие main()
:
int main() {
int foo::* ptr = &foo::x;
double foo::* ptr2 = &foo::d;
}
Здесь у нас нет ничего необычного - два указателя на const
членов.Код компилируется нормально.
Что привлекло мое внимание, так это то, что когда мы добавляем const
, ситуация немного меняется.Рассмотрим следующий код:
int main() {
// no int or double after const
const foo::* ptr = &foo::x;
}
Код прекрасно компилируется на GCC 8.2.0 1 .Обратите внимание, что я не указал, к какому типу данных будет обращаться указатель.
Однако этот код:
int main() {
// notice the only change - "d" instead of "x"
const foo::* ptr = &foo::d;
}
не компилируется со следующей ошибкой:
ошибка: невозможно преобразовать 'double foo::*
' в 'const int foo::*
' при инициализации const foo::* ptr = &foo::d;
Что интересно - это предполагает, что по умолчанию указатель const
указывает наЧлен косвенно объявлен, чтобы указать на некоторый int
член.Это правильное, стандартное поведение?
Стоит отметить, что если мы отбрасываем const
, обе эти строки выдают ошибки:
int main() {
foo::* ptr1 = &foo::x;
foo::* ptr2 = &foo::d;
}
в виде:
ошибка: ожидаемый неквалифицированный идентификатор перед маркером '*
'
ошибка: 'ptr1
' |'ptr2
' не было объявлено в этой области
Таким образом, вопрос - указывает ли стандарт, что const
указатель на член неявно указывает на int
, если мы делаемне указано иное, или это нестандартное поведение? (либо расширение GCC, либо ошибка GCC).
1 РЕДАКТИРОВАТЬ: я использую GCC от MinGW- это конкретная сборка.