Код: Выделить всё
struct C { // #1
// Forward declaration only
struct A; // #2
struct B {
// Pointer declaration is allowed with incomplete type
A* a;
int foo() {
// Member requires complete definition of A
return a->value;
}
};
// Complete definition of A given after B
struct A {
int value;
};
// Members and constructor
A a; B b;
C(int x) : a{x}, b{&a} {}
};
int main() {
C c{42};
return c.b.foo(); // returns 42
}
< /code>
Этот фрагмент успешно компилируется с G ++ и Clang. По -видимому, любой настройка приводит к тому, что этот «вперед смотрящий» ссылается на полное определение struct a Это не теоретическая проблема: открытая библиотека планирования движения, важная библиотека робототехники, использует этот шаблон в нескольких местах для определения компараторов для приоритета. (Поиск репо для MotionCompare , чтобы увидеть более полные примеры).
Итак, вопрос: Почему эта компиляция? Изменилась ли обоснованность этой конструкции по мере развития языкового стандарта? В частности, оба нельзя идентифицировать как дубликаты, не зная ответа. Этот вопрос о явной форвардной заявлении об классе братьев и сестер; Другой посвящен неявному заявлению о родительском классе. Тот факт, что одинаковые правила поиска имени применимы к обеим ситуациям, не был очевиден. Кроме того, поскольку другой вопрос явно не ссылается на занятия вперед или сестер, вряд ли он обнаружит кого-то, кто ищет ответ в этих случаях.
Подробнее здесь: https://stackoverflow.com/questions/797 ... forward-de
Мобильная версия